.. role:: raw-html-m2r(raw) :format: html Contents ======== * `Contents <#contents>`__ * `Telegraf Overview <#telegraf-overview>`__ * `Plugins <#plugins>`__ * `Steps to Independently Build and Deploy the Telegraf Service <#steps-to-independently-build-and-deploy-telegraf-service>`__ * `Steps to Independently Build the Telegraf Service <#steps-to-independently-build-telegraf-service>`__ * `Steps to Independently Deploy the Telegraf Service <#steps-to-independently-deploy-telegraf-service>`__ * `Deploy the Telegraf Service without the the Config Manager Agent Dependency <#deploy-telegraf-service-without-config-manager-agent-dependency>`__ * `Deploy the Telegraf Service with Config Manager Agent Dependency <#deploy-telegraf-service-with-config-manager-agent-dependency>`__ * `Telegraf's Default Configuration <#telegrafs-default-configuration>`__ * `Volume Mounting of Telegraf Configuration Files <#volume-mounting-of-telegraf-conf-files>`__ * `MQTT Sample Configuration and Testing Tool <#mqtt-sample-configuration-and-testing-tool>`__ * `Enable the Message Bus Input Plugin in Telegraf <#enabling-message-bus-input-plugin-in-telegraf>`__ * `Plugin Configuration <#plugin-configuration>`__ * `ETCD Configuration <#etcd-configuration>`__ * `Configuration at Telegraf.conf File <#configuration-at-telegrafconf-file>`__ * `Advanced: Multiple Plugin Sections of EII Message Bus Input Plugin <#advanced-multiple-plugin-sections-of-eii-message-bus-input-plugin>`__ * `Using the Input Plugin <#using-input-plugin>`__ * `Enable the Message Bus Output Plugin in Telegraf <#enable-message-bus-output-plugin-in-telegraf>`__ * `Advanced: Multiple Plugin Sections of Message Bus Output Plugin <#advanced-multiple-plugin-sections-of-message-bus-output-plugin>`__ * `Run the Telegraf Input Output Plugin in IPC Mode <#run-telegraf-input-output-plugin-in-ipc-mode>`__ * `Optional: Adding Multiple Telegraf Instances <#optional-adding-multiple-telegraf-instances>`__ Telegraf Overview ----------------- Telegraf is a part of the `TICKstack `_. It is a plugin-based agent that has many input and output plugins. In EII's basic configuration, it’s being used for data ingestion and sending data to influxDB. However, the EII framework does not restrict any features of Telegraf. Plugins ^^^^^^^ The plugin subscribes to a configured topic or topic prefixes. The plugin has a component called a subscriber, which receives the data from the EII message bus. After receiving the data, depending on the configuration, the plugin processes the data, either synchronously or asynchronously. * In **synchronous** processing**, the receiver thread (the thread that receives the data from the message bus) is also responsible for processing the data (JSON parsing). After processing the previous data only, the receiver thread processes the next data available on the message bus. * In **asynchronous** processing the receiver thread receives the data and put it into the queue. A pool of threads will be dequeuing the data from the queue and processing it. Guidelines for choosing the data processing options are as follows: * Synchronous option:When the ingestion rate is consistent * Asynchronous options:There are two options * Topic-specific queue+threadpool:Frequent spike in ingestion rate for a specific topic * Global queue+threadpool:Sometimes spike in ingestion rate for a specific topic Steps to Independently Build and Deploy the Telegraf Service ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: For running 2 or more microservices, we recommend users to try the use case-driven approach for building and deploying as mentioned in `Generate Consolidated Files for a Subset of Edge Insights for Industrial Services `_. Steps to Independently Build the Telegraf Service ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: When switching between independent deployment of the service with and without config manager agent service dependency, one would run into issues with ``docker-compose build`` w.r.t Certificates folder existence. As a workaround, run the command ``sudo rm -rf Certificates`` to proceed with ``docker-compose build``. To independently build Telegraf service, complete the following steps: #. The downloaded source code should have a directory named Telegraf: .. code-block:: sh cd IEdgeInsights/Telegraf #. Copy the IEdgeInsights/build/.env file using the following command in the current folder .. code-block:: sh cp ../build/.env . .. **NOTE**\ : Update the HOST_IP and ETCD_HOST variables in the .env file with your system IP. .. code-block:: sh # Source the .env using the following command: set -a && source .env && set +a #. Independently build .. code-block:: sh docker-compose build Steps to Independently Deploy the Telegraf Service ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can deploy the Telegraf service in any of the following two ways: Deploy the Telegraf Service withoutthe Config Manager Agent Dependency """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Run the following commands to deploy Telegraf service without Config Manager Agent dependency: .. code-block:: sh # Enter the Telegraf directory cd IEdgeInsights/Telegraf .. Copy the IEdgeInsights/build/.env file using the following command in the current folder, if not already present. .. code-block:: sh cp ../build/.env . **Note:** Ensure that ``docker ps`` is clean and ``docker network ls`` doesn't have EII bridge network. .. code-block:: Update .env file for following: 1. HOST_IP and ETCD_HOST variables with your system IP. 2. `READ_CONFIG_FROM_FILE_ENV` value to `true` and `DEV_MODE` value to `true`. Source the .env using the following command: set -a && source .env && set +a .. code-block:: sh # Run the service docker-compose -f docker-compose.yml -f docker-compose-dev.override.yml up -d .. note:: Telegraf container restarts automatically when its config is modified in ``config.json`` file. If user is updating the config.json file using ``vi or vim`` editor, it is required to append the ``set backupcopy=yes`` in ``~/.vimrc`` so that the changes done on the host machine config.json gets reflected inside the container mount point. Deploy The Telegraf Service with the Config Manager Agent Dependency """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Run the following commands to deploy the Telegraf service with the Config Manager Agent dependency: .. note:: Ensure that the Config Manager Agent image present in the system. If not, build the Config Manager Agent locally when independently deploying the service with Config Manager Agent dependency. .. code-block:: sh # Enter the Telegraf directory cd IEdgeInsights/Telegraf Copy the IEdgeInsights/build/.env file using the following command in the current folder, if not already present. .. code-block:: sh cp ../build/.env . .. note:: Ensure that ``docker ps`` is clean and ``docker network ls`` does not have EII bridge network. .. code-block:: Update .env file for following: 1. HOST_IP and ETCD_HOST variables with your system IP. 2. `READ_CONFIG_FROM_FILE_ENV` value is set to `false`. .. Copy the docker-compose.yml from IEdgeInsights/ConfigMgrAgent as docker-compose.override.yml in IEdgeInsights/Telegraf. .. code-block:: sh cp ../ConfigMgrAgent/docker-compose.yml docker-compose.override.yml .. Copy the builder.py with standalone mode changes from IEdgeInsights/build directory .. code-block:: sh cp ../build/builder.py . Run the builder.py in standalone mode, this will generate eii_config.json and update docker-compose.override.yml .. code-block:: sh python3 builder.py -s true Building the service (This step is optional for building the service if not already done in the ``Independently buildable`` step above) .. code-block:: sh docker-compose build For running the service in PROD mode, run the below command: **NOTE**\ : Make sure to update ``DEV_MODE`` to ``false`` in .env while running in PROD mode and source the .env using the command ``set -a && source .env && set +a``. .. code-block:: sh docker-compose up -d For running the service in DEV mode, run the below command: **NOTE**\ : Make sure to update ``DEV_MODE`` to ``true`` in .env while running in DEV mode and source the .env using the command ``set -a && source .env && set +a``. .. code-block:: sh docker-compose -f docker-compose.yml -f docker-compose-dev.override.yml -f docker-compose.override.yml up -d Telegraf's Default Configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #. Telegraf starts with the default configuration which is present at config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ ) (for the dev mode the name is 'Telegraf_devmode.conf'). By default the below plugins are enabled: * MQTT input plugin (\ **[[inputs.mqtt_consumer]]**\ ) * EII message bus input plugin (\ **[[inputs.eii_msgbus]]**\ ) * Influxdb output plugin (\ **[[outputs.influxdb]]**\ ) Telegraf will be started using script 'telegraf_start.py. This script will get the configuration from ETCD first and then it will start the Telegraf service by picking the right configuration depending on the developer/production mode. By default, only a single instance of the Telegraf container runs (named 'ia_telegraf'). Volume Mounting of Telegraf Configuration Files ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In the DEV mode (\ ``DEV_MODE=true`` in ``[WORK_DIR]/IEdgeInsights/build/.env``\ ), telegraf conf files are being volume mounted inside the Telegraf container image as can be seen in it's ``docker-compose-dev.override.yml``. This gives the flexibility for the developers to update the conf file on the host machine and see the changes being reflected in Telegraf, this can be done by just restarting the Telegraf container without the need to rebuilding the telegraf container image. .. note:: If Telegraf is being run as Multi Telegraf, then make sure that the same file path is volume mounted. Ex: If volume mount Telegraf1 instance, the volume mount would look like: .. code-block:: sh volumes: - ./config/Telegraf1/:/etc/Telegraf/Telegraf1 MQTT Sample Configuration and the Testing Tool ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * To test with MQTT publisher in k8s helm environment, update 'MQTT_BROKER_HOST' Environment Variables in values.yaml(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/helm/values.yaml``\ ) with HOST IP address of the system where MQTT Broker is running. * To test with remote MQTT broker in docker environment, update 'MQTT_BROKER_HOST' Environment Variables in docker-compose.yml(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/docker-compose.yml``\ ) with HOST IP address of the system where MQTT Broker is running. .. code-block:: sh ia_telegraf: environment: ... MQTT_BROKER_HOST: '' * Telegraf instance can be configured with pressure point data ingestion. In the following example, the MQTT input plugin of Telegraf is configured to read pressure point data and stored into the ‘point_pressure_data’ measurement. .. code-block:: sh # # Read metrics from MQTT topic(s) [[inputs.mqtt_consumer]] # ## MQTT broker URLs to be used. The format should be scheme://host:port, # ## schema can be tcp, ssl, or ws. servers = ["tcp://localhost:1883"] # # ## MQTT QoS, must be 0, 1, or 2 # qos = 0 # ## Connection timeout for initial connection in seconds # connection_timeout = "30s" # # ## Topics to subscribe to topics = [ "pressure/simulated/0", ] name_override = "point_pressure_data" data_format = "json" # # # if true, messages that can't be delivered while the subscriber is offline # # will be delivered when it comes back (such as on service restart). # # NOTE: if true, client_id MUST be set persistent_session = false # # If empty, a random client ID will be generated. client_id = "" # # ## username and password to connect MQTT server. username = "" password = "" * To start the MQTT-Publisher with pressure data, .. code-block:: sh cd ../tools/mqtt/publisher/ Change the command option in docker-compose.yml(\ ``[WORK_DIR]/IEdgeInsights/tools/mqtt/publisher/docker-compose.yml``\ ) to: .. code-block:: sh ["--pressure", "10:30"] Build and Run MQTT Publisher: .. code-block:: sh docker-compose up --build -d Refer to the `tools/mqtt/publisher/README.md `_ Enable Message Bus Input Plugin in Telegraf ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The purpose of this enablement is to allow Telegraf to receive data from the message bus and store it into influxdb which is scalable. Plugin Configuration ~~~~~~~~~~~~~~~~~~~~ Configuration of the plugin is divided as follows: * ETCD configuration * Configuration in Telegraf.conf file config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ ) ETCD Configuration """""""""""""""""" As an EII message bus plugin and part of the EII framework, the message bus configuration and plugin’s topic specific configuration is kept in ETCD. Following is the sample configuration: .. code-block:: json { "config": { "influxdb": { "username": "admin", "password": "admin123", "dbname": "datain" }, "default": { "topics_info": [ "topic-pfx1:temperature:10:2", "topic-pfx2:pressure::", "topic-pfx3:humidity" ], "queue_len": 10, "num_worker": 2, "profiling": "false" } }, "interfaces": { "Subscribers": [ { "Name": "default", "Type": "zmq_tcp", "EndPoint": "ia_zmq_broker:60515", "Topics": [ "*" ], "PublisherAppName": "ZmqBroker" } ] } } **Brief Description of the Configuration**. EII’s Telegraf has 'config' and 'interfaces' sections, where: "interfaces" are the EII interface details. "config" are: * config:Contains the configuration of the influxdb (\ **"influxdb"**\ ) and EII message bus input plugin (\ **"default"**\ ). In the above sample configuration, the **" default"** is an instance name. This instance name is referenced from the Telegraf's configuration file config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ ). * topics_info:This is an array of topic prefix configuration, where the user specifies, how the data from the topic prefix should be processed. Following is the interpretation of topic information in every line: #. "topic-pfx1:temperature:10:2":Process data from the topic prefix 'topic-pfx1' asynchronously using the dedicated queue of length 10 and dedicated thread pool of size 2. And the processed data will be stored at a measurement named 'temperature' in influxdb. #. "topic-pfx2:pressure::":Process data from the topic prefix 'topic-pfx2' asynchronously using the global queue and global thread pool. And the processed data will be stored at a measurement named 'pressure' in influxdb. #. "topic-pfx3:humidity" : Process data synchronously. And the processed data will be stored at a measurement named 'humidity' in influxdb. .. **Note**\ : If topic specific configuration is not mentioned, then by default, data is processed synchronously and the measurement name would be the same as the topic name. * queue_len:Global queue length. * num_worker: Global thread pool size. * profiling: This is to enable the profiling mode of this plugin (value can be either "true" or "false"). In profiling mode, every point will get the following information and will be kept in the same measurement: #. Total time spent in plugin (time in ns) #. Time spent in queue (in case of asynchronous processing only and time in ns) #. Time spend in JSON processing (time in ns) #. The name of the thread pool and the thread id which processed the point. .. note:: \ : The name of the global thread pool is "GLOBAL". For a topic specific thread pool, the name is "for-$topic-name".* Configuration at Telegraf.conf File """"""""""""""""""""""""""""""""""" The plugin instance name is an additional key, kept in the plugin configuration section. This key is used to fetch the configuration from ETCD. The following is the minimum sample configuration with a single plugin instance: .. code-block:: [[inputs.eii_msgbus]] **instance_name = "default"** data_format = "json" json_strict = true Here, the value ``default`` acts as a key in the file config. json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ ). For this key, there is a configuration in the ``interfaces`` and ``config`` sections of the file config. json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ ). So the value of ``instance_name`` acts as a connect/glue between the Telegraf configuration config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ ) and the ETCD configuration config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ ). .. note:: \ : As it is a Telegraf input plugin, Telegraf’s parser configuration must be in Telegraf. conf file. More information on the telegraf JSON parser plugin can be found at https://github.com/influxdata/telegraf/tree/master/plugins/parsers/json. If there are multiple Telegraf instances, then the location of the Telegraf configuration files would be different. For more details, refer to the `Optional: Adding multiple Telegraf instance <#optional-adding-multiple-telegraf-instances>`__ section. Advanced: Multiple Plugin Sections of EII Message Bus Input Plugin ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Multiple configuration sections of the message bus input plugin is kept in the **config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ )** file. Following is an example: Assume there are two EII apps, one with the AppName "EII_APP1" and another with the AppName "EII_APP2", which are publishing the data to EII message bus. *The Telegraf's ETCD configuration:* .. code-block:: json { "config":{ "subscriber1":{ "topics_info":[ "topic-pfx1:temperature:10:2", "topic-pfx2:pressure::", "topic-pfx3:humidity" ], "queue_len":100, "num_worker":5, "profiling":"true" }, "subscriber2":{ "topics_info":[ "topic-pfx21:temperature2:10:2", "topic-pfx22:pressure2::", "topic-pfx23:humidity2" ], "queue_len":100, "num_worker":10, "profiling":"true" } }, "interfaces":{ "Subscribers":[ { "Name":"subscriber1", "EndPoint":"EII_APP1_container_name:5569", "Topics":[ "*" ], "Type":"zmq_tcp", "PublisherAppName": "EII_APP1" }, { "Name":"subscriber2", "EndPoint":"EII_APP2_container_name:5570", "Topics":[ "topic-pfx21", "topic-pfx22", "topic-pfx23" ], "Type":"zmq_tcp", "PublisherAppName": "EII_APP2" } ] } } *The Telegraf.conf configuration sections:* .. code-block:: [[inputs.eii_msgbus]] instance_name = "subscriber1" data_format = "json" json_strict = true [[inputs.eii_msgbus]] instance_name = "subscriber2" data_format = "json" json_strict = true Using Input Plugins ^^^^^^^^^^^^^^^^^^^ By default, the message bus input plugin is disabled. To configure the EII input plugin, uncomment the following lines in **config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ )** and **config/Telegraf/Telegraf_devmode.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf_devmode.conf``\ )** .. code-block:: ```sh [[inputs.eii_msgbus]] instance_name = "default" data_format = "json" json_strict = true tag_keys = [ "my_tag_1", "my_tag_2" ] json_string_fields = [ "field1", "field2" ] json_name_key = "" ``` * Edit config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ ) to add message bus input plugin. .. code-block:: sh { "config": { ... "default": { "topics_info": [ "topic-pfx1:temperature:10:2", "topic-pfx2:pressure::", "topic-pfx3:humidity" ], "queue_len": 10, "num_worker": 2, "profiling": "false" }, ... }, "interfaces": { "Subscribers": [ { "Name": "default", "Type": "zmq_tcp", "EndPoint": "ia_zmq_broker:60515", "Topics": [ "*" ], "PublisherAppName": "ZmqBroker" } ], ... } } Enable Message Bus Output Plugin in Telegraf ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Purpose** To receive the data from Telegraf Input Plugin and publish the data to EII msgbus. **Configuration of the Plugin** Configuration of the plugin is divided into two parts: * ETCD configuration * Configuration in Telegraf.conf file config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ ) **ETCD configuration** As an EII message bus plugin and part of the EII framework, the message bus configuration and plugin’s topic specific configuration is kept in ETCD. Following is the sample configuration: .. code-block:: json { "config": { "publisher": { "measurements": ["*"], "profiling": "false" } }, "interfaces": { "Publishers": [ { "Name": "publisher", "Type": "zmq_tcp", "EndPoint": "0.0.0.0:65077", "Topics": [ "*" ], "AllowedClients": [ "*" ] } ] } } **Brief Description of the Configuration** EII’s Telegraf has 'config' and 'interfaces' sections, where: "interfaces" are the EII interface details. "config" are: * config:Contains EII message bus output plugin (\ **"publisher"**\ ). In the above sample configuration, the **"publisher"** is an instance name. This instance name is referenced from the Telegraf's configuration file config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ ) * measurements:This is an array of measurements configuration, where user specifies, which measurement data should be published in message bus. * profiling:This is to enable the profiling mode of this plugin (value can be either "true" or "false"). **Configuration in Telegraf.conf File** The plugin instance name is an additional key, kept in the plugin configuration section. This key is used to fetch the configuration from ETCD. Following is the minimum, sample configuration with a single plugin instance: .. code-block:: [[outputs.eii_msgbus]] instance_name = "publisher" Here, the value **'publisher'** acts as a key in the file **config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ )**. The configuration in the **'interfaces' and 'config'** sections of the file **config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ )** has this key. Here the value of **'instance_name'** acts as a connect/glue between the Telegraf configuration **config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ )** and the **ETCD configuration config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ )** Advanced: Multiple Plugin Sections of Message Bus Output Plugin ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Multiple configuration sections of the message bus output plugin is kept in the **config/Telegraf/Telegraf.conf(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config/Telegraf/Telegraf.conf``\ )** file. *The Telegraf's ETCD configuration:* .. code-block:: json { "config": { "publisher1": { "measurements": ["*"], "profiling": "false" }, "publisher2": { "measurements": ["*"], "profiling": "false" } }, "interfaces": { "Publishers": [ { "Name": "publisher1", "Type": "zmq_tcp", "EndPoint": "0.0.0.0:65077", "Topics": [ "*" ], "AllowedClients": [ "*" ] }, { "Name": "publisher2", "Type": "zmq_tcp", "EndPoint": "0.0.0.0:65078", "Topics": [ "*" ], "AllowedClients": [ "*" ] } ] } } *The Telegraf.conf configuration:* .. code-block:: [[outputs.eii_msgbus]] instance_name = "publisher1" [[outputs.eii_msgbus]] instance_name = "publisher2" Run Telegraf Input Output Plugin in IPC Mode ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Modify the interfaces section of **config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ )** to run in IPC mode: .. code-block:: sh "interfaces": { "Subscribers": [ { "Name": "default", "Type": "zmq_ipc", "EndPoint": { "SocketDir": "/EII/sockets", "SocketFile": "backend-socket" }, "Topics": [ "*" ], "PublisherAppName": "ZmqBroker" } ], "Publishers": [ { "Name": "publisher", "Type": "zmq_ipc", "EndPoint": { "SocketDir": "/EII/sockets", "SocketFile": "telegraf-out" }, "Topics": [ "*" ], "AllowedClients": [ "*" ] } ] } To Add Multiple Telegraf Instances (Optional) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Users can add multiple instances of Telegarf. To do this, user needs to add environment variable named 'ConfigInstance' in the docker-compose.yml file. For every additional telegraf instance, there must be an additional compose section in the docker-compose.yml file. * The configuration for every instance must be in the telegraf image. Following are the standard instances: For instance named $ConfigInstance the telegraf configuration has to be kept in the repository at config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/$ConfigInstance/$ConfigInstance.conf (for production mode) and config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/$ConfigInstance/$ConfigInstance_devmode.conf (for developer mode). The same files will be available inside the respective container at '/etc/Telegraf/$ConfigInstance/$ConfigInstance.conf' (for production mode) '/etc/Telegraf/$ConfigInstance/$ConfigInstance_devmode.conf' (for developer mode) Following are some examples: Example: For $ConfigInstance = 'Telegraf1' * The location of the Telegraf configuration is config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/Telegraf1/Telegraf1.conf (for production mode) and config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/Telegraf1/Telegraf1_devmode.conf (for developer mode) -The additional docker compose section, which is manually added in the file 'docker-compose.yml' is: .. code-block:: sh ia_telegraf1: build: context: $PWD/../Telegraf dockerfile: $PWD/../Telegraf/Dockerfile args: EII_VERSION: ${EII_VERSION} EII_UID: ${EII_UID} EII_USER_NAME: ${EII_USER_NAME} TELEGRAF_SOURCE_TAG: ${TELEGRAF_SOURCE_TAG} TELEGRAF_GO_VERSION: ${TELEGRAF_GO_VERSION} UBUNTU_IMAGE_VERSION: ${UBUNTU_IMAGE_VERSION} CMAKE_INSTALL_PREFIX: ${EII_INSTALL_PATH} container_name: ia_telegraf1 hostname: ia_telegraf1 image: ${DOCKER_REGISTRY}edgeinsights/ia_telegraf:${EII_VERSION} restart: unless-stopped ipc: "none" security_opt: - no-new-privileges read_only: true healthcheck: test: ["CMD-SHELL", "exit", "0"] interval: 5m environment: AppName: "Telegraf" ConfigInstance: "Telegraf1" CertType: "pem,zmq" DEV_MODE: ${DEV_MODE} no_proxy: "${ETCD_HOST},ia_influxdbconnector" NO_PROXY: "${ETCD_HOST},ia_influxdbconnector" ETCD_HOST: ${ETCD_HOST} ETCD_CLIENT_PORT: ${ETCD_CLIENT_PORT} MQTT_BROKER_HOST: ${HOST_IP} INFLUX_SERVER: ${HOST_IP} INFLUXDB_PORT: $INFLUXDB_PORT ETCD_PREFIX: ${ETCD_PREFIX} ports: - 65078:65078 networks: - eii volumes: - "vol_temp_telegraf:/tmp/" - "vol_eii_socket:${SOCKET_DIR}" - ./Certificates/Telegraf:/run/secrets/Telegraf - ./Certificates/rootca:/run/secrets/rootca .. note:: \ : If user wants to add Telegraf output plugin in Telegraf instance, modify config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ ), docker-compose.yml(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/docker-compose.yml``\ ) and Telegraf configuration(.conf) files. #. Add publisher configuration in config.json(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config.json``\ ): .. code-block:: sh { "config": { ..., "": { "measurements": ["*"], "profiling": "true" } }, "interfaces": { ..., "Publishers": [ ..., { "Name": "", "Type": "zmq_tcp", "EndPoint": "0.0.0.0:", "Topics": [ "*" ], "AllowedClients": [ "*" ] } ] } } Example: .. code-block:: sh { "config": { ..., "publisher1": { "measurements": ["*"], "profiling": "true" } }, "interfaces": { ..., "Publishers": [ ..., { "Name": "publisher1", "Type": "zmq_tcp", "EndPoint": "0.0.0.0:65078", "Topics": [ "*" ], "AllowedClients": [ "*" ] } ] } } #. Expose "publisher port" in docker-compose.yml(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/docker-compose.yml``\ ) file: .. code-block:: sh ia_telegraf: ... ports: - : Example: .. code-block:: sh ia_telegraf: ... ports: - 65078:65078 #. Add eii_msgbus output plugin in Telegraf instance configuration file config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/$ConfigInstance/$ConfigInstance.conf (for production mode) and config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/$ConfigInstance/$ConfigInstance_devmode.conf (for developer mode). [[outputs.eii_msgbus]] instance_name = "\ :raw-html-m2r:``\ " Example: For $ConfigInstance = 'Telegraf1' * User needs to add the following section in config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/Telegraf1/Telegraf1.conf (for production mode) and config(\ ``[WORK_DIR]/IEdgeInsights/Telegraf/config``\ )/Telegraf1/Telegraf1_devmode.conf (for developer mode): [[outputs.eii_msgbus]] instance_name = "publisher1" * To allow the changes to the docker file to take place, run the **builder.py** script command. .. code-block:: sh cd [WORK_DIR]/IEdgeInsights/build python3 builder.py * Following are the commands to provision, build and bring up all the containers: .. code-block:: sh cd [WORK_DIR]/IEdgeInsights/build/ docker-compose build docker-compose up -d * Based on the previous example, the user can check that the Telegraf service will have multiple containers using the docker ps command. **Note:** The additional configuration is kept in ``Telegraf/config/$ConfigInstance/telegraf.d`` in a modular way. For example, create a directory ``telegraf.d`` in ``Telegraf/config/config/$ConfigInstance``. .. code-block:: sh mkdir config/$ConfigInstance/telegraf.d cd config/$ConfigInstance/telegraf.d Additional configuration files are kept inside the directory and the following command is used to start the Telegraf in the docker-compose.yml file: .. code-block:: sh command: ["telegraf -config=/etc/Telegraf/$ConfigInstance/$ConfigInstance.conf -config-directory=/etc/Telegraf/$ConfigInstance/telegraf.d"]