常见问题编辑

本节介绍在使用 Fleet 管理的 APM 服务器时可能遇到的常见问题。

没有数据被索引编辑

如果 Elasticsearch 中没有显示任何数据,请首先确保您的 APM 组件已正确连接。

Elastic Agent 是否正常?

在 Kibana 中打开 Fleet 并找到运行 APM 集成的主机;确认其状态为 正常。如果不是,请检查 Elastic Agent 日志以诊断潜在原因。请参阅 监控 Elastic Agent 了解更多信息。

APM 服务器是否正常?

在 Kibana 中,打开 Fleet 并选择运行 APM 集成的主机。打开 日志 选项卡并选择 elastic_agent.apm_server 数据集。查找任何可以帮助诊断问题的 APM 服务器错误。

APM 代理是否可以连接到 APM 服务器

要确定 APM 代理是否可以连接到 APM 服务器,请向检测的服务发送请求,并在 APM 服务器日志中查找包含 [request] 的行。

如果没有记录任何请求,请确认

  1. SSL 没有 配置错误
  2. 主机是正确的。例如,如果您使用的是 Docker,请确保绑定到正确的接口(例如,设置 apm-server.host = 0.0.0.0:8200 以匹配任何 IP),并相应地在 APM 代理中设置 SERVER_URL 设置。

如果您看到请求通过 APM 服务器,但未被接受(响应代码不是 202),请参阅 APM 服务器响应代码 以缩小可能的原因范围。

检测差距

APM 代理为许多流行的框架和库提供自动检测。如果 APM 代理没有自动检测您期望的内容,则数据将不会发送到 Elastic Stack。有关自动检测内容的详细信息,请参阅相关的 APM 代理文档

数据已编入索引,但未出现在 APM 应用中编辑

APM 应用依赖索引映射来查询和显示数据。如果您的 APM 数据未显示在 APM 应用中,而是显示在 Kibana 的其他位置(如 Discover 应用),则可能是缺少索引映射。

您可以使用 _mapping API 确定字段是否已正确映射。例如,在 Kibana 控制台 中运行以下命令。这将显示 service.name 字段的字段数据类型。

GET *apm*/_mapping/field/service.name

如果 mapping.name.type"text",则您的 APM 索引未正确设置。

".ds-metrics-apm.transaction.1m-default-2023.04.12-000038": {
   "mappings": {
      "service.name": {
         "full_name": "service.name",
         "mapping": {
            "name": {
               "type": "text" 
            }
         }
      }
   }
}

如果此字段已正确设置,则 service.name mapping.name.type 将为 "keyword"

要解决此问题,请按照以下步骤安装 APM 集成

如果您有互联网连接

需要互联网连接才能通过 Kibana 中的 Fleet UI 安装 APM 集成。

  1. 打开 Kibana 并选择 添加集成 > Elastic APM
  2. 单击 APM 集成
  3. 单击 添加 Elastic APM
  4. 单击 保存并继续
  5. 单击 稍后添加 Elastic Agent。您无需运行 Elastic Agent 即可完成设置。
如果您没有互联网连接

如果您的环境有网络流量限制,则可以通过其他方式安装 APM 集成。有关更多信息,请参阅 无互联网环境

选项 1:更新 kibana.yml

更新 kibana.yml 以包含以下内容,然后重新启动 Kibana。

xpack.fleet.packages:
- name: apm
  version: latest

有关如何编辑 Kibana 配置文件的更多信息,请参阅 配置 Kibana

选项 2:使用 Fleet API

使用 Fleet API 安装 APM 集成。要成功执行此操作,需要针对 Kibana API 运行,而不是针对 Elasticsearch API 运行。

POST kbn:/api/fleet/epm/packages/apm/8.14.2
{ "force": true }

有关如何使用 Kibana API 的更多信息,请参阅 Kibana API

这将重新安装 APM 索引模板并触发数据流索引滚动更新。

您可以通过在 Kibana 控制台中运行以下命令来验证是否已安装正确的索引模板

GET /_index_template/traces-apm

常见的 SSL 相关问题编辑

SSL 客户端无法连接编辑

目标主机可能无法访问,或者证书可能无效。要解决此问题

  1. 确保目标主机上的 APM 服务器进程正在运行,并且您可以连接到它。尝试 ping 目标主机以验证您可以从运行 APM 服务器的主机访问它。然后使用 nctelnet 确保端口可用。例如

    ping <hostname or IP>
    telnet <hostname or IP> 5044
  2. 验证证书是否有效,以及主机名和 IP 是否匹配。
  3. 使用 OpenSSL 测试与目标服务器的连接并诊断问题。有关更多信息,请参阅 OpenSSL 文档
x509:无法验证 <IP 地址> 的证书,因为它不包含任何 IP SAN编辑

发生这种情况是因为您的证书仅对“主题”字段中存在的主机名有效。要解决此问题,请尝试以下解决方案之一

  • 为主机名创建一个 DNS 条目,将其映射到服务器的 IP。
  • /etc/hosts 中为主机名创建一个条目。或者,在 Windows 上,将条目添加到 C:\Windows\System32\drivers\etc\hosts
  • 重新创建服务器证书并为服务器的 IP 地址添加一个主题备用名称 (SAN)。这会使服务器的证书对主机名和 IP 地址都有效。
getsockopt:没有到主机的路由编辑

这不是 SSL 问题。这是一个网络问题。确保两台主机可以通信。

getsockopt:连接被拒绝编辑

这不是 SSL 问题。确保 Logstash 正在运行,并且没有防火墙阻止流量。

无法建立连接,因为目标计算机主动拒绝了它编辑

防火墙拒绝连接。检查防火墙是否在客户端、网络或目标主机上阻止了流量。

I/O 超时编辑

当您的堆栈中的超时设置配置不正确时(尤其是在使用负载均衡器时),可能会发生 I/O 超时。

您可能会在 APM 代理日志中看到如下错误,以及/或者在 APM 服务器端看到类似错误

[ElasticAPM] APM Server responded with an error:
"read tcp 123.34.22.313:8200->123.34.22.40:41602: i/o timeout"

要解决此问题,请确保超时从 APM 代理、负载均衡器到 APM 服务器递增。

默认情况下,代理超时设置为 10 秒,服务器超时设置为 3600 秒。您的负载均衡器应该设置在这些数字之间。

例如

APM agent --> Load Balancer  --> APM Server
   10s            15s               3600s

可以通过更新读取整个请求的最长时间来配置 APM 服务器超时。

字段限制超出编辑

当在事务或跨度上添加太多不同的标签键时,您可能会面临映射爆炸的风险。

例如,您应该避免将用户指定的数据(如 URL 参数)用作标签键。同样,使用当前时间戳或用户 ID 作为标签键也不是一个好主意。但是,具有高基数的标签不是问题。尽量将不同标签键的数量保持在最低限度。

映射爆炸的症状是,在一段时间后,事务和跨度不再被索引。通常,在第二天,跨度和事务将再次被索引,因为每天都会创建一个新索引。但是,一旦达到字段限制,索引就会再次停止。

在代理日志中,您不会看到任何失败迹象,因为 APM 服务器会异步地将从代理接收到的数据发送到 Elasticsearch。但是,APM 服务器和 Elasticsearch 会记录如下警告

{\"type\":\"illegal_argument_exception\",\"reason\":\"Limit of total fields [1000] in [INDEX_NAME] has been exceeded\"}

基于尾部的采样导致系统内存使用率高和磁盘 IO 高编辑

基于尾部的采样只需要最少的内存即可运行,并且 RSS 内存使用量不会明显增加。但是,由于基于尾部的采样会将数据写入磁盘,因此由于磁盘 IO,可能会看到操作系统页面缓存内存使用量显着增加。如果在启用基于尾部的采样后发现吞吐量下降和磁盘活动过多,请确保系统中有足够的内存空间供操作系统页面缓存有效地执行磁盘 IO。