influxdata/influxdata-docker

Start Telegraf container with latest config from Influx Web UI [workaround]

default-student opened this issue · 3 comments

I am trying to implement a TIG stack.
Telegraf should be configurable from the influx UI,
but the Telegraf container expects a config file, while the Influx UI instructs one to start telegraf with a call to the api that serves the config created by influx.

This makes it quite tedious to have both configs actually be the same.

There is no command i could start the telegraf container with which always gets the latest config created in the influx ui.

Below i will share my attempts to create a compose file for this.

My first attempt was to upload the config to git.
I used a setup container that downloads it and puts it into a shared volume.
The telegraf container mounts this volume and uses it as a config under /etc/telegraf/telegraf.conf
The influx container is started with a custom command

chmod +x /home/telegraf/create-or-update-influx-telegraf-config.sh
nohup /entrypoint.sh &
sleep 5
/home/telegraf/create-or-update-influx-telegraf-config.sh &
tail -f /dev/null

with

#!/bin/bash

# Check if any Telegraf configs exist
configs=$(influx telegrafs | tail -n +2)

if [ -z "$configs" ]; then
  echo No configs exist, create a new one
  influx telegrafs create --name 'Gitlab Telegraf Configuration' --token 'V2-token==' --org 'org' --description 'Configuration pulled from the Telegraf Volume which is pulled from the Gitlab' --file /home/telegraf/telegraf.conf &
else
  echo Update the first config
  config_id=$(echo "$configs" | head -n 1 | awk '{print $1}')
  influx telegrafs update --id "$config_id" --name 'Gitlab Telegraf Configuration' --description 'Configuration pulled from the Telegraf Volume which is pulled from the Gitlab' --file /home/telegraf/telegraf.conf
fi

which updates or creates the config from gitlab in the influx container.

This however doesnt mean that the config can now be edited in the influx web ui.

It does store the changes when I edit it, but it does not store it at the given file location but somewhere else.

This makes this unsuitable if one wants to update the config via the webui.

okay a personal fix, but nothing that changes the fundamental problem:

version: '3.9'

services:

  telegraf:
    image: telegraf
    container_name: influxdb-telegraf
    depends_on:
      setup:
        condition: service_completed_successfully

    entrypoint: ["/bin/bash", "-c", "/etc/telegraf/wait-for-id-then-start-with-config.sh"]

    environment:
      DOCKER_INFLUXDB_INIT_MODE: setup
      DOCKER_INFLUXDB_INIT_USERNAME: user
      DOCKER_INFLUXDB_INIT_PASSWORD: password
      DOCKER_INFLUXDB_INIT_ORG: org
      DOCKER_INFLUXDB_INIT_BUCKET: bucket
      DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: V2-token==
      INFLUX_TOKEN: V2-token==
      DOCKER_INFLUXDB_INIT_CLI_CONFIG_NAME: configname2
    volumes:
      - telegraf:/etc/telegraf
      # - ./telegraf.conf:/etc/telegraf/telegraf.conf
    networks:
      - 'network'


  influxdb:
    image: influxdb
    container_name: influxdb2
    depends_on:
      setup:
        condition: service_completed_successfully

    command: >
      bash -c "
        nohup /entrypoint.sh &
        sleep 5
        chmod +x /home/telegraf/create-config-store-id-in-vol.sh
        /home/telegraf/create-config-store-id-in-vol.sh
        tail -f /dev/null
      "

    environment:
      DOCKER_INFLUXDB_INIT_MODE: setup
      DOCKER_INFLUXDB_INIT_USERNAME: user
      DOCKER_INFLUXDB_INIT_PASSWORD: password
      DOCKER_INFLUXDB_INIT_ORG: org
      DOCKER_INFLUXDB_INIT_BUCKET: bucket
      DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: V2-token==
      DOCKER_INFLUXDB_INIT_CLI_CONFIG_NAME: configname2

    volumes:
      - influxdbv2:/var/lib/influxdb2:rw
      - influxconfig:/etc/influxdb2
      - telegraf:/home/telegraf
    ports:
      - "8086:8086"
    networks:
      - 'network'


# Service container
  # Purge any leftover files, clone repo, copy necessary files to the temporary volume
  setup:
    image: bitnami/git:latest
    container_name: setup
    command: >
      bash -c "
        echo clearing Volumes
          rm -rf /home/telegraf/*
          rm -rf /home/influxdb/* --force
          rm -rf /home/influxconfig/* --force
          
        echo emptied telegraf conf folder:
         ls /home/telegraf
        echo emptied influxdb database folder:
         ls /home/influxdb
        echo emptied influxdb database folder:
          ls /home/influxconfig

        echo Cloning git with config:
          git clone https://gitlab.de/my-repository/myrrepo.git
        echo downloaded:
          ls ./myrrepo
        echo copying git to telegraf config volume
          cp -R ./myrrepo/. /home/telegraf
        echo copied:
          ls /home/telegraf

        echo applying permissions:configs:
          chmod +x /home/telegraf/wait-for-id-then-start-with-config.sh
      "

      #   echo create data files in cleared folders:
      #     cd /home/telegraf
      #     touch '$$(date)'
      #     cd /home/influxdb
      #     touch '$$(date)'
      # cat /home/telegraf/telegraf.conf
      # tail -f /dev/null
      
    volumes:
      - telegraf:/home/telegraf
      - influxdbv2:/home/influxdb
      - influxconfig:/home/influxconfig

networks:
  network:
    driver: bridge  
    name: influxdb-telegraf-net

volumes:
  influxdbv2:
  influxconfig:
  telegraf:

with the create config and store id script

# check for config ids
configs=$(influx telegrafs | tail -n +2)

if [ -z "$configs" ]; then
  echo No configs exist, create a new one
  config_id=$(influx telegrafs create --name 'Gitlab Telegraf Configuration' --token 'V2-token==' --org 'org' --description 'Configuration pulled from the Telegraf Volume which is pulled from the Gitlab. It can be updated using the Influxdb WebUI and is pulled by the Telegraf container on restart. Please backup changes to the Github repo! Please restart the Telegraf container when changed.' --file /home/telegraf/telegraf.conf | awk '{if (NR == 2) print $1}')
  echo created config with id: '$config_id'
  touch /home/telegraf/telegraf.id
  echo "$config_id" >> /home/telegraf/telegraf.id
  echo stored id in '/home/telegraf/telegraf.id'
else
  echo config already exists just storing the id
  config_id=$(echo "$configs" | head -n 1 | awk '{print $1}')
  touch /home/telegraf/telegraf.id
  echo "$config_id" >> /home/telegraf/telegraf.id
  echo stored id: '$config_id' in '/home/telegraf/telegraf.id'
fi

and the script that waits for the config id and starts the telegraf agent.

file="/etc/telegraf/telegraf.id"

echo waiting for file: /etc/telegraf/telegraf.id
while [ ! -f "/etc/telegraf/telegraf.id" ]; 
do
	echo waiting for file: /etc/telegraf/telegraf.id
    sleep 1
done

id=$(cat "/etc/telegraf/telegraf.id")
echo running telegraf from the config with the id: '$id'
telegraf --config http://influxdb:8086/api/v2/telegrafs/$id

This docker compose works as a portainer stack, which requires there be no other files. Thus all files are pulled from a git repo by the service container. Then the influxdb container is initialized and the telegraf config pulled from the repo is specified as the telegraf config. The id of this config is stored in a shared volume file. the telegraf container waits for this file and uses the id to access the config stored in influx.

This enables us to modifiy the telegraf config in the influx web ui and after a restart of the telegraf container these changes are used.

I would greatly appreciate if there was a simpler way, but this is the solution for our organization for now.