如何解决 telegraf 中的此错误?
How do I troubleshoot this error in 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 执行插件时文件中的某些内容出现故障。
- 插件代码如下。
插件代码(/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
接下来我该做什么?
请检查权限。
好像是权限错误。由于 telegraf 具有必要的权限 运行ning sudo -u telegraf
有效。但是您尝试使用的 user
没有访问 /my_company/plugins-enabled/
.
中文件的必要权限
所以我会建议查看它们并将权限更改为 Other can access and write
或您尝试使用 telegraf 的用户名。
为了修复这个运行命令去目录:
cd /my_company/plugins-enabled/
然后将所有权更改为您且只有您:
sudo chown -R $(whoami)
然后更改对所有文件和文件夹的 read/write 权限,否则:
sudo chmod -R u+w
如果您希望每个人,字面意思是系统上的每个人都可以访问read/write这些文件和文件夹并且只想将所有权限授予所有人:
sudo chmod -R 777
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。这会让您更好地控制记录的内容。
我怀疑您 运行 遇到了环境问题,您 运行 的方式有些不同。如果不是权限,可能是环境变量的差异。
我有一个自定义的 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 执行插件时文件中的某些内容出现故障。 - 插件代码如下。
插件代码(/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
接下来我该做什么?
请检查权限。
好像是权限错误。由于 telegraf 具有必要的权限 运行ning sudo -u telegraf
有效。但是您尝试使用的 user
没有访问 /my_company/plugins-enabled/
.
所以我会建议查看它们并将权限更改为 Other can access and write
或您尝试使用 telegraf 的用户名。
为了修复这个运行命令去目录:
cd /my_company/plugins-enabled/
然后将所有权更改为您且只有您:
sudo chown -R $(whoami)
然后更改对所有文件和文件夹的 read/write 权限,否则:
sudo chmod -R u+w
如果您希望每个人,字面意思是系统上的每个人都可以访问read/write这些文件和文件夹并且只想将所有权限授予所有人:
sudo chmod -R 777
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。这会让您更好地控制记录的内容。
我怀疑您 运行 遇到了环境问题,您 运行 的方式有些不同。如果不是权限,可能是环境变量的差异。