首页 > 解决方案 > 无法将指标发送到 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).

当我恢复索引时,消息消失了,但索引下仍然没有保存数据。我无法弄清楚我的情况出了什么问题,因为官方文档对此主题非常简短。我在这个论坛上找到了两个线程(12)和其他一些类似的线程,但答案只包含文档中的相同示例。我试图包含示例中的元数据,但这并没有解决问题。它没有说明perflog源类型实际上是什么。我也尝试log2metrics_json了 sourcetype,但它也没有帮助。

标签: jsonmetricssplunk

解决方案


看起来您正在使用raw端点但发送一个 json 对象。将您的端点更改为just /services/collector,然后重试。

示例页面的原始示例部分中,它显示raw端点的数据只是一个简单的字符串。

否则,即使您的事件已被 API 接受,也并不意味着它已被编入索引(它会立即返回 Success,因此您的客户端不会挂起等待索引器)。接受事件后,可能有多种原因可能无法对其编制索引,包括中断或其他一些系统故障。这就是索引器确认的用武之地。

可以为每个令牌启用索引器确认。如果启用,连同“成功”状态,ackId将发送一个 int。一旦您拥有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]}"

这将返回如下内容:

{"acks": {"0": true, "1": false, "2": true, "3": false}}

其中 true 表示它已被索引,而 false 表示它还没有(尚未)。对于每个没有的,文档建议您继续轮询,直到它们被编入索引或者您在再次发送事件之前达到超时(您配置的)。

在请求channel中,除了在您的令牌上启用索引器确认之外,还需要一个查询参数。这是用于跟踪客户事件和状态的任何唯一字符串。除了查询参数,您还可以在X-Splunk-Request-Channel标头中传递值。

请务必阅读文档底部的客户端行为部分。它有一些我在这里没有提到的有用的最佳实践。


推荐阅读