Как мне устранить эту ошибку в telegraf?

#python #influxdb #telegraf #telegraf-inputs-plugin #telegraf-plugins

#python #influxdb #telegraf #telegraf-inputs-плагин #telegraf-плагины

Вопрос:

У меня есть пользовательский плагин python, который я использую для извлечения данных в Telegraf. Он выводит вывод линейного протокола, как и ожидалось.

В моей среде Ubuntu 18.04 при запуске этого плагина я вижу одну строку в своих журналах:

 2020-12-28T21:55:00Z E! [inputs.exec] Error in plugin: exec: exit status 1 for command '/my_company/plugins-enabled/plugin-mysystem/poll_mysystem.py': Traceback (most recent call last):...
 

Вот и все. Я не могу понять, как получить фактическую обратную трассировку.

Если я запущу sudo -u telegraf /usr/bin/telegraf -config /etc/telegraf/telegraf.conf , плагин будет работать так, как ожидалось. Он опрашивает и загружает данные точно так, как должен.

Я не уверен, как продвигаться вперед с устранением этой ошибки, когда telegraf запускает плагин самостоятельно.

Я перезапустил службу telegraf. У меня есть проверенные разрешения (и я думаю, что приведенное выше выполнение показывает, что оно должно работать).

Несколько дополнительных деталей, основанных на полученных комментариях и ответах:

  • Плагин находится в каталоге, которому принадлежит вся структура telegraf:telegraf . Похоже, ошибка не указывает на то, что он не может видеть выполняемый файл, а скорее что-то внутри файла выходит из строя, когда Telegraf запускает плагин.
  • Код для подключаемого модуля приведен ниже.

Код плагина ( /my_company/plugins-enabled/plugin-mysystem/poll_mysystem.py ):

 from google.auth.transport.requests import Request
from google.oauth2 import id_token
import requests
import os

RUNTIME_URL = INTERNAL_URL
MEASUREMENT = "MY_MEASUREMENT"
CREDENTIALS = "GOOGLE_SERVICE_FILE.json"
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = CREDENTIALS  # ENV VAR REQUIRED BY GOOGLE CODE BELOW
CLIENT_ID = VALUE_FROM_GOOGLE

exclude_fields = ["name", "version"] # Don't try to put these into influxdb from json response

def make_iap_request(url, client_id, method="GET", **kwargs):
    # Code provided by Google docs
    # Set the default timeout, if missing
    if "timeout" not in kwargs:
        kwargs["timeout"] = 90

    # Obtain an OpenID Connect (OIDC) token from metadata server or using service
    # account.
    open_id_connect_token = id_token.fetch_id_token(Request(), client_id)

    # Fetch the Identity-Aware Proxy-protected URL, including an
    # Authorization header containing "Bearer " followed by a
    # Google-issued OpenID Connect token for the service account.
    resp = requests.request(method, url, headers={"Authorization": "Bearer {}".format(open_id_connect_token)}, **kwargs)
    if resp.status_code == 403:
        raise Exception("Service account does not have permission to " "access the IAP-protected application.")
    elif resp.status_code != 200:
        raise Exception(
            "Bad response from application: {!r} / {!r} / {!r}".format(resp.status_code, resp.headers, resp.text)
        )
    else:
        return resp.json()


def print_results(results):
    """
    Take the results of a Dolores call and print influx line protocol results
    """
    for item in results["workflow"]:
        line_protocol_line_base = f"{MEASUREMENT},name={item['name']}"
        values = ""
        for key, value in item.items():
            if key not in exclude_fields:
                values = values   f",{key}={value}"
        values = values[1:]
        line_protocol_line = f"{line_protocol_line_base} {values}"
        print(line_protocol_line)


def main():
    current_runtime = make_iap_request(URL, CLIENT_ID, timeout=30)
    print_results(current_runtime)


if __name__== "__main__":
    main()
 

Соответствующая часть telegraf.conf файла:

 [[inputs.exec]]
  ## Commands array
  commands = [
    "/my_company/plugins-enabled/plugin-*/poll_*.py",
  ]
 

Раздел агента конфигурационного файла

 [agent]
  interval = "60s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  debug = false
  quiet = false
  logfile = "/var/log/telegraf/telegraf.log"
  hostname = ""
  omit_hostname = true
 

Что мне делать дальше?

Ответ №1:

exec Плагин усекает ваше сообщение об исключении в новой строке. Если вы обернете свой вызов make_iap_request в блок try / except , а затем print(e, file=sys.stderr) вместо того, чтобы позволить исключению всплывать до конца, это должно сказать вам больше.

 def main():
    """
    Query URL and print line protocol
    """
    try:
        current_runtime = make_iap_request(URL, CLIENT_ID, timeout=30)
        print_results(current_runtime)
    except Exception as e:
        print(e, file=sys.stderr)
 

С другой стороны, ваш скрипт может записывать сообщения об ошибках в свой собственный файл журнала, а не передавать их обратно в Telegraf. Это даст вам больше контроля над тем, что регистрируется.

Я подозреваю, что вы столкнулись с проблемой среды, где есть что-то другое в том, как вы ее запускаете. Если нет разрешений, это могут быть различия в переменных среды.

Комментарии:

1. Это было полезно для определения дальнейших способов устранения неполадок. Хотя я не решил ее, это помогло мне преодолеть однострочную ошибку, которую telegraf представляет в своих журналах.

Ответ №2:

Пожалуйста, проверьте разрешения. Похоже, это ошибка разрешения. Поскольку telegraf имеет необходимые разрешения, запуск sudo -u telegraf работает. Но user у того, из которого вы пытаетесь, нет необходимых разрешений для доступа к файлам /my_company/plugins-enabled/ .

Поэтому я рекомендую изучить их и изменить разрешения на Other can access and write или на имя пользователя, с которого вы пытаетесь использовать telegraf.

Чтобы исправить это, запустите команду для перехода в каталог:

cd /my_company/plugins-включен/

Затем сменить владельца на вас и только на вас:

sudo chown -R $ (whoami)

Затем, чтобы изменить разрешения на чтение / запись для всех файлов и папок в противном случае:

sudo chmod -R u w

И если вы хотите, чтобы все, буквально все в системе имели доступ к чтению / записи в эти файлы и папки, и просто хотите предоставить все разрешения всем:

sudo chmod -R 777

Комментарии:

1. Весь каталог, из которого запускается пользовательский плагин, принадлежит telegraf:telegraf