【问题标题】:How do I troubleshoot this error in telegraf?如何解决电报中的此错误?
【发布时间】:2021-04-05 15:44:39
【问题描述】:

我有一个自定义的 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 自行执行插件时,我不确定如何继续解决此错误。

我已重新启动电报服务。我已经验证了权限(并且我认为上面的执行表明它应该可以工作)。

基于收到的 cmets 和答案的一些额外细节:

  • 插件位于整个结构归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

接下来我该怎么做?

【问题讨论】:

    标签: python influxdb telegraf telegraf-inputs-plugin telegraf-plugins


    【解决方案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。这将使您能够更好地控制记录的内容。

    我怀疑您遇到了环境问题,您的运行方式有所不同。如果不是权限,可能是环境变量差异。

    【讨论】:

    • 这有助于确定如何进一步排除故障。虽然我还没有解决它,但这确实让我克服了 telegraf 在其日志中出现的单行错误。
    【解决方案2】:

    请检查权限。 好像是权限错误。由于电报具有运行sudo -u telegraf 工作的必要权限。但是您尝试使用的 user 没有访问 /my_company/plugins-enabled/ 中文件的必要权限。

    因此,我建议您查看它们并将权限更改为 Other can access and write 或您尝试使用电报的用户名。

    为了解决这个问题,运行命令去目录:

    cd /my_company/plugins-enabled/

    然后将所有权更改给您并且只有您:

    sudo chown -R $(whoami)

    然后更改对所有文件和文件夹的读/写权限:

    sudo chmod -R u+w

    如果您希望 everyone, 从字面上看是系统上的 everyone 有权读取/写入这些文件和文件夹,并且只想将所有权限授予所有人:

    sudo chmod -R 777

    【讨论】:

    • 运行自定义插件的整个目录归telegraf:telegraf所有
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2017-12-12
    • 2012-02-14
    • 2015-04-12
    • 2016-06-21
    相关资源
    最近更新 更多