

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# HTTP 端点问题排查
<a name="http_troubleshooting"></a>

本节介绍在处理 Amazon Data Firehose 向通用 HTTP 终端节点目的地和合作伙伴目的地（包括 Datadog、Dynatrace、MongoDB、New Relic、Splunk 或 Sumo Logic）传输数据时的常见故障排除步骤。 LogicMonitor就本节而言，所有适用的目标均称为 HTTP 端点。确保在 Firehose 流中指定的 IAM 角色可以访问 S3 备份存储桶以及用于数据转换的 Lambda 函数（如果启用了数据转换）。此外，请确保 IAM 角色有权访问 CloudWatch 日志组和日志流，以检查错误日志。有关更多信息，请参阅[授予 Firehose 访问终端节点目标的 HTTP 权限](https://docs.amazonaws.cn/firehose/latest/dev/controlling-access.html#using-iam-http)。

**注意**  
本节中的信息不适用于以下目的地：Splunk、 OpenSearch 服务、S3 和 Redshift。

## CloudWatch 日志
<a name="cloudwatch_logs"></a>

强烈建议您为启用[CloudWatch 日志记录](monitoring-with-cloudwatch-logs.md)。只有在传输到目标出现错误时才会发布日志。

### 目标异常
<a name="destination_exceptions"></a>

 **ErrorCode: HttpEndpoint.DestinationException** 

```
{
    "deliveryStreamARN": "arn:aws:firehose:us-east-1:123456789012:deliverystream/ronald-test",
    "destination": "custom.firehose.endpoint.com...",
    "deliveryStreamVersionId": 1,
    "message": "The following response was received from the endpoint destination. 413: {\"requestId\": \"43b8e724-dbac-4510-adb7-ef211c6044b9\", \"timestamp\": 1598556019164, \"errorMessage\": \"Payload too large\"}",
    "errorCode": "HttpEndpoint.DestinationException",
    "processor": "arn:aws:lambda:us-east-1:379522611494:function:httpLambdaProcessing"
}
```

目标异常表示 Firehose ****能够建立到端点的连接并发出 HTTP 请求，但**未**收到 200 响应代码。不是 200 的 2xx 响应也会导致目标异常。Amazon Data Firehose 将响应代码和从配置的终端节点收到的截断响应负载记录到日志中。 CloudWatch 由于 Amazon Data Firehose 会在不进行修改或解释的情况下日志记录响应代码和有效负载，因此端点需要提供拒绝 Amazon Data Firehose 的 HTTP 传输请求的具体原因。以下是针对这些异常的最常见的问题排查建议：
+ **400**：表示由于 Amazon Data Firehose 配置错误，您发送的请求不正确。确保目标位置具有正确的 [url](https://docs.amazonaws.cn/firehose/latest/APIReference/API_HttpEndpointConfiguration.html#Firehose-Type-HttpEndpointConfiguration-Url)、[通用属性](https://docs.amazonaws.cn/firehose/latest/APIReference/API_HttpEndpointRequestConfiguration.html#Firehose-Type-HttpEndpointRequestConfiguration-CommonAttributes)、[内容编码](https://docs.amazonaws.cn/firehose/latest/APIReference/API_HttpEndpointRequestConfiguration.html#Firehose-Type-HttpEndpointRequestConfiguration-ContentEncoding)、[访问密钥](https://docs.amazonaws.cn/firehose/latest/APIReference/API_HttpEndpointConfiguration.html#Firehose-Type-HttpEndpointConfiguration-AccessKey)和[缓冲提示](https://docs.amazonaws.cn/firehose/latest/APIReference/API_HttpEndpointDestinationConfiguration.html#Firehose-Type-HttpEndpointDestinationConfiguration-BufferingHints)。有关所需配置，请参阅特定于目标的文档。
+ **401**：表示您为 Firehose 流配置的访问密钥不正确或丢失。
+ **403**：表示您为 Firehose 流配置的访问密钥无权将数据传输到配置的端点。
+ **413**：表示 Amazon Data Firehose 发送到端点的请求负载太大，端点无法处理。尝试[降低缓冲提示](https://docs.amazonaws.cn/firehose/latest/APIReference/API_HttpEndpointBufferingHints.html#Firehose-Type-HttpEndpointBufferingHints-SizeInMBs)，达到目标的建议大小。
+ **429**：表示 Amazon Data Firehose 发送请求的速率高于目标可以处理的速率。通过增加缓冲时间 and/or ，增加缓冲大小（但仍在目的地的限制范围内）来微调缓冲提示。
+ **5xx**：表示目标存在问题。Amazon Data Firehose 服务仍在正常运行。

**重要**  
重要提示：虽然这些是常见的问题排查建议，但特定端点提供响应代码的原因可能不同，应首先遵循特定端点的建议。

### 无效响应
<a name="invalid_response"></a>

 **ErrorCode: HttpEndpoint.InvalidResponseFromDestination** 

```
{
    "deliveryStreamARN": "arn:aws:firehose:us-east-1:123456789012:deliverystream/ronald-test",
    "destination": "custom.firehose.endpoint.com...",
    "deliveryStreamVersionId": 1,
    "message": "The response received from the specified endpoint is invalid. Contact the owner of the endpoint to resolve the issue. Response for request 2de9e8e9-7296-47b0-bea6-9f17b133d847 is not recognized as valid JSON or has unexpected fields. Raw response received: 200 {\"requestId\": null}",
    "errorCode": "HttpEndpoint.InvalidResponseFromDestination",
    "processor": "arn:aws:lambda:us-east-1:379522611494:function:httpLambdaProcessing"
}
```

无效响应异常表示 Amazon Data Firehose 从端点目标接收到无效响应。响应必须符合[响应规范](httpdeliveryrequestresponse.md)，否则 Amazon Data Firehose 将认为传输尝试失败，并将重新传输相同的数据，直到超过配置的重试持续时间。Amazon Data Firehose 会将不符合响应规范的响应视为失败，即使响应的状态为 200。如果您正在开发兼容 Amazon Data Firehose 的端点，请遵循响应规范，以确保数据成功传输。

以下是一些常见的无效响应类型以及解决方法：
+ **无效 JSON 或意外字段**：表示无法将响应正确解串为 JSON 或包含意外字段。确保响应未经过内容编码。
+ **缺失 RequestId**：表示响应不包含 requestId。
+ **RequestId 不匹配**：表示响应中的请求 ID 与传出的 requestId 不匹配。
+ **缺少时间戳**：表示响应不包含时间戳字段。时间戳字段必须是数字，而不是字符串。
+ **缺少 Content-Type 标头**：表示响应不包含 “内容类型： application/json” 标头。不接受其他 content-type。

**重要**  
重要提示：Amazon Data Firehose 只能将数据传输到遵循 Firehose 请求和[响应规范](httpdeliveryrequestresponse.md)的端点。如果您将目的地配置为第三方服务，请确保使用兼容 Amazon Data Firehose 的正确端点，该端点可能与公有摄取端点不同。例如，Datadog 的 Amazon Data Firehose 端点是 `https://aws-kinesis-http-intake.logs.datadoghq.com/`，而其公有端点是 `https://api.datadoghq.com/`。

### 其他常见错误
<a name="others"></a>

下面列出了其他错误代码和定义。
+ **错误代码： HttpEndpoint.RequestTimeout**-表示终端节点的响应时间超过 3 分钟。如果您是目标的所有者，请缩短目标端点的响应时间。如果您不是目标的所有者，请联系所有者，询问是否可以采取任何措施来缩短响应时间（即减少缓冲提示，从而减少每次请求处理的数据）。
+ **错误代码： HttpEndpoint.ResponseTooLarge**-表示响应过大。包括标头在内的响应必须小于 1MiB。
+ **错误代码： HttpEndpoint.ConnectionFailed**-表示无法与配置的端点建立连接。这可能是由于配置的 url 中存在拼写错误，Amazon Data Firehose 无法访问端点，或者端点响应连接请求的时间过长。
+ **错误代码： HttpEndpoint.ConnectionReset**-表示已建立连接，但终端已重置或过早关闭。
+ **错误代码： HttpEndpoint.SSLHandshakeFailure**-表示无法使用已配置的端点成功完成 SSL 握手。