1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. http://creativecommons.org/licenses/by/4.0
3 .. (c) OPNFV, Intel Corporation and others.
4 .. _barometer-ves-userguide:
6 ==========================
7 VES Application User Guide
8 ==========================
10 The Barometer repository contains a python based application for VES (VNF Event
11 Stream) which receives the `collectd`_ specific metrics via `Kafka`_ bus,
12 normalizes the metric data into the VES message format and sends it into the VES
15 The application currently supports pushing platform relevant metrics through the
16 additional measurements field for VES.
18 Collectd has a ``write_kafka`` plugin that sends collectd metrics and values to
19 a Kafka Broker. The VES message formatting application, ves_app.py, receives metrics from
20 the Kafka broker, normalises the data to VES message format for forwarding to VES collector.
21 The VES message formatting application will be simply referred to as the "VES application"
24 The VES application can be run in host mode (baremetal), hypervisor mode (on a host with a hypervisor
25 and VMs running) or guest mode(within a VM). The main software blocks that are required to run the
26 VES application demo are:
36 1. Dependencies: install JAVA & Zookeeper.
42 $ sudo apt-get install default-jre
43 $ sudo apt-get install zookeeperd
44 $ sudo apt-get install python-pip
51 $ sudo yum install java-1.8.0-openjdk
52 $ sudo yum install epel-release
53 $ sudo yum install python-pip
54 $ sudo yum install zookeeper
55 $ sudo yum install telnet
56 $ sudo yum install wget
58 .. note:: You may need to add the repository that contains zookeeper.
59 To do so, follow the step below and try to install `zookeeper` again
60 using steps above. Otherwise, skip next step.
65 https://archive.cloudera.com/cdh5/one-click-install/redhat/7/x86_64/cloudera-cdh-5-0.x86_64.rpm
71 $ sudo zookeeper-server start
73 if you get the error message like ``ZooKeeper data directory is missing at /var/lib/zookeeper``
74 during the start of zookeeper, initialize zookeeper data directory using
75 the command below and start zookeeper again, otherwise skip the next step.
79 $ sudo /usr/lib/zookeeper/bin/zkServer-initialize.sh
80 No myid provided, be sure to specify it in /var/lib/zookeeper/myid if using non-standalone
82 2. Test if Zookeeper is running as a daemon.
86 $ telnet localhost 2181
88 Type 'ruok' & hit enter.
89 Expected response is 'imok' which means that Zookeeper is up running.
93 .. note:: VES doesn't work with version 0.9.4 of kafka-python. The
94 recommended/tested version is 1.3.3.
98 $ sudo pip install kafka-python
99 $ wget "https://archive.apache.org/dist/kafka/1.0.0/kafka_2.11-1.0.0.tgz"
100 $ tar -xvzf kafka_2.11-1.0.0.tgz
101 $ sed -i -- 's/#delete.topic.enable=true/delete.topic.enable=true/' kafka_2.11-1.0.0/config/server.properties
102 $ sudo nohup kafka_2.11-1.0.0/bin/kafka-server-start.sh \
103 kafka_2.11-1.0.0/config/server.properties > kafka_2.11-1.0.0/kafka.log 2>&1 &
105 .. note:: If Kafka server fails to start, please check if the platform IP
106 address is associated with the hostname in the static host lookup
107 table. If it doesn't exist, use the following command to add it.
111 $ echo "$(ip route get 8.8.8.8 | awk '{print $NF; exit}') $HOSTNAME" | sudo tee -a /etc/hosts
113 4. Test the Kafka Installation
115 To test if the installation worked correctly there are two scripts, producer and consumer scripts.
116 These will allow you to see messages pushed to broker and receive from broker.
118 Producer (Publish "Hello World"):
122 $ echo "Hello, World" | kafka_2.11-1.0.0/bin/kafka-console-producer.sh \
123 --broker-list localhost:9092 --topic TopicTest > /dev/null
125 Consumer (Receive "Hello World"):
129 $ kafka_2.11-1.0.0/bin/kafka-console-consumer.sh --zookeeper \
130 localhost:2181 --topic TopicTest --from-beginning --max-messages 1 --timeout-ms 3000
136 Install development tools:
142 $ sudo apt-get install build-essential bison autotools-dev autoconf
143 $ sudo apt-get install pkg-config flex libtool
149 $ sudo yum group install 'Development Tools'
151 .. The libkafka installed via the package manager may not work with collectd
152 (due to compilation issue). Thus, it's recommented to use the library installed
153 from sources using latest stable version of libkafka.
155 Install Apache Kafka C/C++ client library:
159 $ git clone https://github.com/edenhill/librdkafka.git ~/librdkafka
161 $ git checkout -b v0.9.5 v0.9.5
162 $ ./configure --prefix=/usr
166 Build collectd with Kafka support:
170 $ git clone https://github.com/collectd/collectd.git ~/collectd
173 $ ./configure --with-librdkafka=/usr --without-perl-bindings --enable-perl=no
174 $ make && sudo make install
178 If installing from git repository ``collectd.conf`` configuration file will be located in
179 directory ``/opt/collectd/etc/``. If installing from via a package manager ``collectd.conf``
180 configuration file will be located in directory ``/etc/collectd/``
182 Configure and start collectd. Modify Collectd configuration file ``collectd.conf``
185 - Within a VM: `Setup VES application (guest mode)`_
186 - On Host with VMs: `Setup VES application (hypervisor mode)`_
187 - No Virtualization: `Setup VES application (host mode)`_
189 Start collectd process as a service as described in :ref:`install-collectd-as-a-service`.
191 Setup VES application (guest mode)
192 ----------------------------------
194 In this mode Collectd runs from within a VM and sends metrics to the VES collector.
196 .. figure:: ves-app-guest-mode.png
200 Install dependencies:
204 $ sudo pip install pyyaml python-kafka
206 Clone Barometer repo and start the VES application:
210 $ git clone https://gerrit.opnfv.org/gerrit/barometer
211 $ cd barometer/3rd_party/collectd-ves-app/ves_app
212 $ nohup python ves_app.py --events-schema=guest.yaml --config=ves_app_config.conf > ves_app.stdout.log &
215 Modify Collectd configuration file ``collectd.conf`` as following:
217 .. include:: collectd-ves-guest.conf
221 Start collectd process as a service as described in :ref:`install-collectd-as-a-service`.
225 The above configuration is used for a localhost. The VES application can be
226 configured to use remote VES collector and remote Kafka server. To do
227 so, the IP addresses/host names needs to be changed in ``collector.conf``
228 and ``ves_app_config.conf`` files accordingly.
231 Setup VES application (hypervisor mode)
232 ----------------------------------------
234 This mode is used to collect hypervisor statistics about guest VMs and to send
235 those metrics into the VES collector. Also, this mode collects host statistics
236 and send them as part of the guest VES message.
238 .. figure:: ves-app-hypervisor-mode.png
240 VES hypervisor mode setup
242 Running the VES in hypervisor mode looks like steps described in
243 `Setup VES application (guest mode)`_ but with the following exceptions:
245 - The ``hypervisor.yaml`` configuration file should be used instead of ``guest.yaml``
246 file when VES application is running.
248 - Collectd should be running on hypervisor machine only.
250 - Addition ``libvirtd`` dependencies needs to be installed on where
251 collectd daemon is running. To install those dependencies, see :ref:`virt-plugin`
252 section of Barometer user guide.
254 - The next (minimum) configuration needs to be provided to collectd to be able
255 to generate the VES message to VES collector.
258 At least one VM instance should be up and running by hypervisor on the host.
260 .. include:: collectd-ves-hypervisor.conf
264 Start collectd process as a service as described in :ref:`install-collectd-as-a-service`.
268 The above configuration is used for a localhost. The VES application can be
269 configured to use remote VES collector and remote Kafka server. To do
270 so, the IP addresses/host names needs to be changed in ``collector.conf``
271 and ``ves_app_config.conf`` files accordingly.
274 .. note:: The list of the plugins can be extented depends on your needs.
277 Setup VES application (host mode)
278 ----------------------------------
280 This mode is used to collect platform wide metrics and to send those metrics into the VES collector.
281 It is most suitable for running within a baremetal platform.
283 Install dependencies:
287 $ sudo pip install pyyaml
289 Clone Barometer repo and start the VES application:
293 $ git clone https://gerrit.opnfv.org/gerrit/barometer
294 $ cd barometer/3rd_party/collectd-ves-app/ves_app
295 $ nohup python ves_app.py --events-schema=host.yaml --config=ves_app_config.conf > ves_app.stdout.log &
298 .. figure:: ves-app-host-mode.png
300 VES Native mode setup
302 Modify collectd configuration file ``collectd.conf`` as following:
304 .. include:: collectd-ves-host.conf
307 Start collectd process as a service as described in :ref:`install-collectd-as-a-service`.
311 The above configuration is used for a localhost. The VES application can be
312 configured to use remote VES collector and remote Kafka server. To do
313 so, the IP addresses/host names needs to be changed in ``collector.conf``
314 and ``ves_app_config.conf`` files accordingly.
317 .. note:: The list of the plugins can be extented depends on your needs.
320 .. _Setup VES Test Collector:
322 Setup VES Test Collector
323 ------------------------
325 .. note:: Test Collector setup is required only for VES application testing
328 Install dependencies:
332 $ sudo pip install jsonschema
334 Clone VES Test Collector:
338 $ git clone https://github.com/att/evel-test-collector.git ~/evel-test-collector
340 Modify VES Test Collector config file to point to existing log directory and
345 $ sed -i.back 's/^\(log_file[ ]*=[ ]*\).*/\1collector.log/' ~/evel-test-collector/config/collector.conf
346 $ sed -i.back 's/^\(schema_file[ ]*=.*\)event_format_updated.json$/\1CommonEventFormat.json/' ~/evel-test-collector/config/collector.conf
348 Start VES Test Collector:
352 $ cd ~/evel-test-collector/code/collector
353 $ nohup python ./collector.py --config ../../config/collector.conf > collector.stdout.log &
356 VES application configuration description
357 -----------------------------------------
359 **Details of the Vendor Event Listener REST service**
361 REST resources are defined with respect to a ``ServerRoot``::
363 ServerRoot = https://{Domain}:{Port}/{optionalRoutingPath}
365 REST resources are of the form::
367 {ServerRoot}/eventListener/v{apiVersion}`
368 {ServerRoot}/eventListener/v{apiVersion}/{topicName}`
369 {ServerRoot}/eventListener/v{apiVersion}/eventBatch`
371 Within the VES directory (``3rd_party/collectd-ves-app/ves_app``) there is a
372 configuration file called ``ves_app_conf.conf``. The description of the
373 configuration options are described below:
376 VES domain name. It can be IP address or hostname of VES collector
377 (default: ``127.0.0.1``)
380 VES port (default: ``30000``)
383 Used as the "optionalRoutingPath" element in the REST path (default: ``vendor_event_listener``)
386 Used as the "topicName" element in the REST path (default: ``example_vnf``)
388 **UseHttps** *true|false*
389 Allow application to use HTTPS instead of HTTP (default: ``false``)
391 **Username** *"username"*
392 VES collector user name (default: empty)
394 **Password** *"passwd"*
395 VES collector password (default: empty)
397 **SendEventInterval** *interval*
398 This configuration option controls how often (sec) collectd data is sent to
399 Vendor Event Listener (default: ``20``)
401 **ApiVersion** *version*
402 Used as the "apiVersion" element in the REST path (default: ``3``)
405 Kafka Port (Default ``9092``)
407 **KafkaBroker** *host*
408 Kafka Broker domain name. It can be an IP address or hostname of local or remote server
409 (default: ``localhost``)
412 VES YAML configuration format
413 -----------------------------
415 The format of the VES message is generated by the VES application based on the
416 YAML schema configuration file provided by user via ``--events-schema``
417 command-line option of the application.
419 .. note:: Use ``--help`` option of VES application to see the
420 description of all available options
422 .. note:: The detailed installation guide of the VES application is described in
423 the `VES Application User Guide`_.
425 The message defined by YAML schema should correspond to format defined in
426 `VES shema definition`_.
428 .. warning:: This section doesn't explain the YAML language itself, so the
429 knowledge of the YAML language is required before continue reading it!
431 Since, the VES message output is a JSON format, it's recommended to understand
432 how YAML document is converted to JSON before starting to create a new YAML
433 definition for the VES. E.g.:
435 The following YAML document:
440 additionalMeasurements:
442 instance: someinstance
444 will be converted to JSON like this:
449 "additionalMeasurements": {
450 "instance": "someinstance",
455 .. note:: The `YAML syntax` section of `PyYAML documentation`_ can be used
456 as a reference for this.
462 The VES agent can generate two type of messages which are sent to the VES
463 collector. Each message type must be specified in the YAML configuration file
464 using a specific YAML tag.
467 This type is used to send a message defined in YAML configuration to the VES
468 collector with a specified interval (default is 20 sec and it's configurable
469 via command line option of the application). This type can be specified in
470 the configuration using ``!Measurements`` tag. For instance:
476 My Host Measurements: !Measurements
477 ... # message definition
480 This type is used to send a message defined in YAML configuration to the VES
481 collector when collectd notification is received from Kafka bus (collectd
482 ``write_kafka`` plugin). This type can be specified in the configuration
483 using ``!Events`` tag. For instance:
490 ... # event definition
493 Collectd metrics in VES
494 -----------------------
496 The VES application caches collectd metrics received via Kafka bus. The data
497 is stored in a table format. It's important to know it before mapping collectd
498 metric values to message defined in YAML configuration file.
500 VES collectd metric cache example:
502 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
503 | host | plugin | plugin_instance | type | type_instace | time | value | ds_name | interval |
504 +===========+===========+====================+===========+================+===================+========+=========+==========+
505 | localhost | cpu | | percent | user | 1509535512.30567 | 16 | value | 10 |
506 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
507 | localhost | memory | | memory | free | 1509535573.448014 | 798456 | value | 10 |
508 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
509 | localhost | interface | | eth0 | if_packets | 1509544183.956496 | 253 | rx | 10 |
510 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
511 | 7ec333e7 | virt | Ubuntu-12.04.5-LTS | percent | virt_cpu_total | 1509544402.378035 | 0.2 | value | 10 |
512 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
513 | 7ec333e7 | virt | Ubuntu-12.04.5-LTS | memory | rss | 1509544638.55119 | 123405 | value | 10 |
514 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
515 | 7ec333e7 | virt | Ubuntu-12.04.5-LTS | if_octets | vnet1 | 1509544646.27108 | 67 | tx | 10 |
516 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
517 | cc659a52 | virt | Ubuntu-16.04 | percent | virt_cpu_total | 1509544745.617207 | 0.3 | value | 10 |
518 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
519 | cc659a52 | virt | Ubuntu-16.04 | memory | rss | 1509544754.329411 | 4567 | value | 10 |
520 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
521 | cc659a52 | virt | Ubuntu-16.04 | if_octets | vnet0 | 1509544760.720381 | 0 | rx | 10 |
522 +-----------+-----------+--------------------+-----------+----------------+-------------------+--------+---------+----------+
524 It's possible from YAML configuration file to refer to any field of any row of
525 the table via special YAML tags like ``ValueItem`` or ``ArrayItem``. See the
526 `Collectd metric reference`_ reference for more details.
528 .. note:: The `collectd data types file`_ contains map of ``type`` to
529 ``ds_name`` field. It can be used to get possible value for ``ds_name``
530 field. See the `collectd data types description`_ for more details on
534 Aging of collectd metric
535 ~~~~~~~~~~~~~~~~~~~~~~~~
537 If the metric will not be updated by the collectd during the double metric
538 interval time, it will be removed (aged) from VES internal cache.
544 There are four type of references supported by the YAML format: System,
545 Config, Collectd metric and Collectd notification. The format of the reference
550 "{<ref type>.<attribute name>}"
552 .. note:: Possible values for ``<ref type>`` and ``<attribute name>`` are
553 described in farther sections.
559 This reference is used to get system statistics like time, date etc. The system
560 reference (``<ref type>`` = ``system``) can be used in any place of the YAML
561 configuration file. This type of reference provides the following attributes:
564 The name of the host where VES application is running.
567 Unique ID during VES application runtime.
570 Current time in seconds since the Epoch. For example ``1509641411.631951``.
573 Current date in ISO 8601 format, ``YYYY-MM-DD``. For instance ``2017-11-02``.
580 Date: "{system.date}"
586 This reference is used to get VES configuration described in `VES application
587 configuration description`_ sectoin. The reference (``<ref type>`` = ``config``)
588 can be used in any place of the YAML configuration file. This type of reference
589 provides the following attributes:
592 Measurements dispatch interval. It referenses to ``SendEventInterval``
593 configuration of the VES application.
600 Interval: "{config.interval}"
603 Collectd metric reference
604 ~~~~~~~~~~~~~~~~~~~~~~~~~
606 This reference is used to get the attribute value of collectd metric from the
607 VES cache. The reference (``<ref type>`` = ``vl``) can be used ONLY inside
608 ``Measurements``, ``ValueItem`` and ``ArrayItem`` tags. Using the reference
609 inside a helper tag is also allowed if the helper tag is located inside the
610 tag where the reference is allowed (e.g.: ``ArrayItem``). The
611 ``<attribute name>`` name corresponds to the table field name described in
612 `Collectd metrics in VES`_ section. For example:
616 name: "{vl.type}-{vl.type_instance}"
619 Collectd notification reference
620 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
622 This reference is used to get the attribute value of received collectd
623 notification. The reference (``<ref type>`` = ``n``) can be used ONLY inside
624 ``Events`` tag. Using the reference inside a helper tag is also allowed if
625 the helper tag is located inside the ``Events`` tag. This type of reference
626 provides the following attributes:
629 The hostname of received collectd notification.
632 The plugin name of received collectd notification.
635 The plugin instance of the received collectd notification.
638 The type name of the received collectd notification.
641 The type instance of the received collectd notification.
644 The severity of the received collectd notification.
647 The message of the received collectd notification.
650 .. note:: The exact value for each attribute depends on the collectd plugin
651 which may generate the notification. Please refer to the
652 `collectd plugin description`_ document to get more details on the specific
659 sourceId: "{n.plugin_instance}"
662 Collectd metric mapping YAML tags
663 ---------------------------------
665 This section describes the YAML tags used to map collectd metric values in the
666 YAML configuration file.
672 This tag is a YAML map which is used to define the VES measurement message. It's
673 allowed to be used multiple times in the document (e.g.: you can define multiple
674 VES messages in one YAML document). This tag works in the same way as `ArrayItem
675 tag`_ does and all keys have the same description/rules.
681 This tag is used to select a collectd metric and get its attribute value using
682 `Collectd metric reference`_. The type of this tag is a YAML array of maps with
683 the possible keys described below.
685 ``SELECT`` (required)
686 Is a YAML map which describes the select metric criteria. Each key name of the
687 map must correspond to the table field name described in `Collectd metrics in VES`_
691 Describes the value to be assigned. If not provided, the default
692 ``!Number "{vl.value}"`` expression is used.
694 ``DEFAULT`` (optional)
695 Describes the default value which will be assigned if no metric is selected
696 by ``SELECT`` criteria.
699 ValueItem tag description example:
703 memoryFree: !ValueItem
708 - VALUE: !Bytes2Kibibytes "{vl.value}"
711 The tag process workflow is described on the figure below.
713 .. figure:: value-item-parse-workflow.png
715 YAML ValueItem tag process workflow
721 This tag is used to select a list of collectd metrics and generate a YAML array
722 of YAML items described by ``ITEM-DESC`` key. If no collectd metrics are
723 selected by the given criteria, the empty array will be returned.
725 ``SELECT`` (optional)
726 Is a YAML map which describes the select metrics criteria. Each key name of
727 the map must correspond to the table field name described in `Collectd
728 metrics in VES`_ section. The value of the key may be regular expression. To
729 enable regular expression in the value, the YAML string containing ``/`` char
730 at the beginning and at the end should be used. For example:
734 plugin: "/^(?!virt).*$/" # selected all metrics except ``virt`` plugin
736 The VES application uses the python RE library to work with regular
737 expression specified in the YAML configuration. Please refer to `python
738 regular expression syntax`_ documentation for more details on a syntax
741 Multiple ``SELECT`` keys are allowed by the tag. If nor ``SELECT`` or
742 ``INDEX-KEY`` key is specified, the VES error is generated.
744 ``INDEX-KEY`` (optional)
745 Is a YAML array which describes the unique fields to be selected by the tag.
746 Each element of array is a YAML string which should be one of the table field
747 name described in `Collectd metrics in VES`_ section. Please note, if this
748 key is used, only fields specified by the key can be used as a collectd
749 reference in the ``ITEM-DESC`` key.
751 ``ITEM-DESC`` (required)
752 Is a YAML map which describes each element of the YAML array generated by
753 the tag. Using ``ArrayItem`` tags and other `Helper YAML tags`_ are also
754 allowed in the definition of the key.
756 In the example below, the ArrayItem tag is used to generate an array of
757 ``ITEM-DESC`` items for each collectd metrics except ``virt`` plugin with
758 unique ``plugin``, ``plugin_instance`` attribute values.
762 Measurements: !ArrayItem
764 plugin: "/^(?!virt).*$/"
769 name: !StripExtraDash "{vl.plugin}-{vl.plugin_instance}"
771 The tag process workflow is described on the figure below.
773 .. figure:: array-item-parse-workflow.png
775 YAML ArrayItem tag process workflow
778 Collectd event mapping YAML tags
779 --------------------------------
781 This section describes the YAML tags used to map the collectd notification to
782 the VES event message in the YAML configuration file.
788 This tag is a YAML map which is used to define the VES event message. It's
789 allowed to be used multiple times in the document (e.g.: you can map multiple
790 collectd notification into VES message in one YAML document). The possible
791 keys of the tag are described below.
793 ``CONDITION`` (optional)
794 Is a YAML map which describes the select metric criteria. Each key name of
795 the map must correspond to the name of attribute provided by `Collectd
796 notification reference`_. If no such key provided, any collectd notification
797 will map the defined YAML message.
799 ``ITEM-DESC`` (required)
800 Is a YAML map which describes the message generated by this tag. Only `Helper
801 YAML tags`_ are allowed in the definition of the key.
803 The example of the VES event message which will be generate by the VES
804 application when collectd notification of the ``virt`` plugin is triggered
815 eventType: Notification
816 sourceId: &event_sourceId "{n.plugin_instance}"
817 sourceName: *event_sourceId
818 lastEpochMicrosec: !Number "{n.time}"
819 startEpochMicrosec: !Number "{n.time}"
821 alarmInterfaceA: !StripExtraDash "{n.plugin}-{n.plugin_instance}"
822 alarmCondition: "{n.severity}"
823 faultFieldsVersion: 1.1
831 This section describes the YAML tags used as utilities for formatting the output
832 message. The YAML configuration process workflow is described on the figure
835 .. figure:: parse-work-flow.png
837 YAML configuration process workflow
840 Convert string to number tag
841 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
843 The ``!Number`` tag is used in YAML configuration file to convert string value into
844 the number type. For instance:
848 lastEpochMicrosec: !Number "3456"
850 The output of the tag will be the JSON number.
855 lastEpochMicrosec: 3456
859 Convert bytes to Kibibytes tag
860 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
862 The ``!Bytes2Kibibytes`` tag is used in YAML configuration file to convert
863 bytes into kibibytes (1 kibibyte = 1024 bytes). For instance:
867 memoryConfigured: !Bytes2Kibibytes 4098
868 memoryConfigured: !Bytes2Kibibytes "1024"
870 The output of the tag will be the JSON number.
880 Convert one value to another tag
881 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
883 The ``!MapValue`` tag is used in YAML configuration file to map one value
884 into another value defined in the configuration. For instance:
894 The output of the tag will be the mapped value.
906 The ``!StripExtraDash`` tag is used in YAML configuration file to strip extra
907 dashes in the string (dashes at the beginning, at the end and double dashes).
912 name: !StripExtraDash string-with--extra-dashes-
914 The output of the tag will be the JSON string with extra dashes removed.
919 name: string-with-extra-dashes
926 #. Only one document can be defined in the same YAML configuration file.
928 #. The collectd notification is not supported by `Kafka collectd plugin`_. Due to
929 this limitation, the collectd notifications cannot be received by the VES
930 application and the defined YAML event will not be generated and sent to the
931 VES collector. Please note, that VES YAML format already supports the events
932 definition and the format is descibed in the document.
935 .. _collectd: http://collectd.org/
936 .. _Kafka: https://kafka.apache.org/
937 .. _`VES`: https://wiki.opnfv.org/display/fastpath/VES+plugin+updates
938 .. _`VES shema definition`: https://gerrit.onap.org/r/gitweb?p=demo.git;a=tree;f=vnfs/VES5.0/evel/evel-test-collector/docs/att_interface_definition;hb=refs/heads/master
939 .. _`PyYAML documentation`: https://pyyaml.org/wiki/PyYAMLDocumentation
940 .. _`collectd plugin description`: https://github.com/collectd/collectd/blob/master/src/collectd.conf.pod
941 .. _`collectd data types file`: https://github.com/collectd/collectd/blob/master/src/types.db
942 .. _`collectd data types description`: https://github.com/collectd/collectd/blob/master/src/types.db.pod
943 .. _`python regular expression syntax`: https://docs.python.org/2/library/re.html#regular-expression-syntax
944 .. _`Kafka collectd plugin`: https://collectd.org/wiki/index.php/Plugin:Write_Kafka