无法将指标发送到 Splunk HEC
Unable to send metrics to Splunk HEC
我在我的 Splunk v. 8.1.1 服务器上设置了一个 HEC 输入,我正在尝试向它发送指标,即:
curl -k https://$SPLUNK_HOST:$HEC_PORT/services/collector/raw -H "Authorization: Splunk $HEC_TOKEN" \
-d "
{'time': 1610123044, 'fields': {'metric_name': 'kernel.all.load', '_value': 2.8499999046325684, 'instance_id': 1, 'instance_name': '1 minute'}}
{'time': 1610123044, 'fields': {'metric_name': 'kernel.all.load', '_value': 3.8299999237060547, 'instance_id': 5, 'instance_name': '5 minute'}}
{'time': 1610123044, 'fields': {'metric_name': 'kernel.all.load', '_value': 3.6700000762939453, 'instance_id': 15, 'instance_name': '15 minute'}}"
(注意:为清楚起见,在引号内添加了换行符)
我每次都得到服务器的肯定响应:
{'text': 'Success', 'code': 0}
但是索引中没有保存数据。我为 HEC 输入设置了默认索引。如果我删除或禁用此索引,我会在 Splunk 的主页上收到消息,即:
Received event for unconfigured/disabled/deleted index=pcp_hec with source="source::http:PCP via HEC" host="host::localhost:32926" sourcetype="sourcetype::httpevent". So far received events from 1 missing index(es).
当我恢复索引时,消息消失了,但索引下仍然没有保存任何数据。我无法弄清楚我的情况出了什么问题,因为官方文档对此主题非常简短。我在这个论坛 (1, 2) 上发现了两个话题,在其他地方也发现了一些类似的话题,但答案只包含文档中的相同示例。我试图包含示例中的元数据,但这并没有解决问题。它没有说明 perflog
sourcetype 实际上是什么。我也尝试了 log2metrics_json
的 sourcetype,但它也没有帮助。
您似乎在使用 raw
端点,但发送的是 json object。将您的端点更改为 /services/collector
,然后重试。
从 examples 页面的 原始示例 部分,它显示 raw
端点的数据只是一个简单的字符串。
否则,即使您的活动已被 API 接受,但这并不意味着它已被编入索引(它 return 立即成功,因此您的客户不会挂起等待索引器)。事件被接受后,有多种原因可能无法将其编入索引,包括中断或其他一些系统故障。这就是 Indexer Acknowledgement 的用武之地。
可以为每个令牌启用索引器确认。如果启用,连同“成功”状态,将发送一个 int ackId
。获得 ackId
(或来自同一客户端的多个请求的 ID)后,您可以使用端点 /services/collector/ack
:
检查它们的状态
curl -k https://<host>:<port>/services/collector/ack?channel=FE0ECFAD-13D5-401B-847D-77833BD77131 -H "Authorization: Splunk {token}" -d "{"acks":[0,1,2,3]}"
这将 return 类似于:
{"acks": {"0": true, "1": false, "2": true, "3": false}}
其中 true 表示它已被索引,false 表示它还没有(尚未)。对于每个没有的,文档建议您继续轮询,直到它们被编入索引或达到超时(您配置的),然后再发送事件。
在请求中,除了在您的令牌上启用索引器确认之外,还需要一个查询参数 channel
。这是用于跟踪客户事件和状态的任何唯一字符串。除了查询参数,您还可以在 X-Splunk-Request-Channel
header.
中传递值
确保也阅读了文档底部的客户端行为部分。它有一些我在这里没有提到的有用的最佳实践。
我在我的 Splunk v. 8.1.1 服务器上设置了一个 HEC 输入,我正在尝试向它发送指标,即:
curl -k https://$SPLUNK_HOST:$HEC_PORT/services/collector/raw -H "Authorization: Splunk $HEC_TOKEN" \
-d "
{'time': 1610123044, 'fields': {'metric_name': 'kernel.all.load', '_value': 2.8499999046325684, 'instance_id': 1, 'instance_name': '1 minute'}}
{'time': 1610123044, 'fields': {'metric_name': 'kernel.all.load', '_value': 3.8299999237060547, 'instance_id': 5, 'instance_name': '5 minute'}}
{'time': 1610123044, 'fields': {'metric_name': 'kernel.all.load', '_value': 3.6700000762939453, 'instance_id': 15, 'instance_name': '15 minute'}}"
(注意:为清楚起见,在引号内添加了换行符)
我每次都得到服务器的肯定响应:
{'text': 'Success', 'code': 0}
但是索引中没有保存数据。我为 HEC 输入设置了默认索引。如果我删除或禁用此索引,我会在 Splunk 的主页上收到消息,即:
Received event for unconfigured/disabled/deleted index=pcp_hec with source="source::http:PCP via HEC" host="host::localhost:32926" sourcetype="sourcetype::httpevent". So far received events from 1 missing index(es).
当我恢复索引时,消息消失了,但索引下仍然没有保存任何数据。我无法弄清楚我的情况出了什么问题,因为官方文档对此主题非常简短。我在这个论坛 (1, 2) 上发现了两个话题,在其他地方也发现了一些类似的话题,但答案只包含文档中的相同示例。我试图包含示例中的元数据,但这并没有解决问题。它没有说明 perflog
sourcetype 实际上是什么。我也尝试了 log2metrics_json
的 sourcetype,但它也没有帮助。
您似乎在使用 raw
端点,但发送的是 json object。将您的端点更改为 /services/collector
,然后重试。
从 examples 页面的 原始示例 部分,它显示 raw
端点的数据只是一个简单的字符串。
否则,即使您的活动已被 API 接受,但这并不意味着它已被编入索引(它 return 立即成功,因此您的客户不会挂起等待索引器)。事件被接受后,有多种原因可能无法将其编入索引,包括中断或其他一些系统故障。这就是 Indexer Acknowledgement 的用武之地。
可以为每个令牌启用索引器确认。如果启用,连同“成功”状态,将发送一个 int ackId
。获得 ackId
(或来自同一客户端的多个请求的 ID)后,您可以使用端点 /services/collector/ack
:
curl -k https://<host>:<port>/services/collector/ack?channel=FE0ECFAD-13D5-401B-847D-77833BD77131 -H "Authorization: Splunk {token}" -d "{"acks":[0,1,2,3]}"
这将 return 类似于:
{"acks": {"0": true, "1": false, "2": true, "3": false}}
其中 true 表示它已被索引,false 表示它还没有(尚未)。对于每个没有的,文档建议您继续轮询,直到它们被编入索引或达到超时(您配置的),然后再发送事件。
在请求中,除了在您的令牌上启用索引器确认之外,还需要一个查询参数 channel
。这是用于跟踪客户事件和状态的任何唯一字符串。除了查询参数,您还可以在 X-Splunk-Request-Channel
header.
确保也阅读了文档底部的客户端行为部分。它有一些我在这里没有提到的有用的最佳实践。