如何使用 Elastic Stack 轻松关联日志和 APM 跟踪信息,进而提高可观测性 | Elastic Blog
工程

如何轻松关联日志和 APM 跟踪信息,进而提高可观测性

应用程序性能监测 (APM) 和日志均为您的生态系统提供关键洞见。当与上下文结合在一起时,它们可提供有关如何解决应用程序问题的重要线索。

随着您分析的日志数据日渐复杂,使用传统工具导航到相关部分可能会很棘手。借助 Elastic 可观测性(由 Elastic Stack 提供支持),在 Kibana 中单击几下即可将日志与 APM 关联起来,轻松便捷。在 Web 应用中轻松查看与用户针对特定事务提出的特定请求相关的日志。

在 Elastic APM 中查看跟踪日志

下方是 Elastic APM 的截图,显示了特定事务中涉及的所有操作的详细分解。如果单击 Actions(操作):

单击 Elastic APM 中跟踪样例右上角的“Actions”(操作)

然后选择 Show trace logs(显示跟踪日志):

单击“Show trace logs”(显示跟踪日志)。

大功告成:

现在您可以在 Elastic APM 中看到与跟踪信息相关联的日志。

这些消息是与此特定事务有关的额外详细信息。此类详细信息不适合 APM 或任何其他类型的监测,因此实际上只能由日志提供。现在,由于 Elastic Stack 将这些不同监测方面整合在一起,我们可以非常灵活地向事务添加额外详细信息。将这些不同类型的数据存储在同一个数据存储中,使我们可以快速地对调查进行透视。

安装并配置 Elastic APM Python 代理

您可能会说,“这确实很棒,但是我怎么才能在我的系统中达到相似的效果?”

让我们看一个示例,逐步了解如何将日志和 APM 跟踪信息整合到一起。以下是上方截图中显示的 Python 应用的相关代码。必须找到一种方法,向用户对应用发出的每个请求添加信息。

首先,我们需要安装最基本的 Elastic APM Python 代理。将其添加为依赖项。这是一个 Flask 应用,所以在依赖项名称后的方括号里显示 [flask](每个受支持框架的详细信息均可以在 Python 代理文档中找到)。

# 在 requirements.txt 中 
elastic-apm[flask]==5.3.3

首先准备好正确的 import 语句:

# 在 app.py 中 
import logging 
from elasticapm.contrib.flask import ElasticAPM 
from elasticapm.handlers.logging import Formatter

然后,配置 Python 代理,向 APM 服务器发送信息:

# 在 app.py 中 
app = Flask(__name__)  # 照常初始化应用 
app.config['ELASTIC_APM'] = { 
  'SERVICE_NAME': 'foodbankhero',

  # 设置自定义 APM 服务器 URL(默认:http://localhost:8200) 
  'SERVER_URL': 'http://localhost:8200' 

  # APM 服务器需要令牌时使用 
  # 可以将 APM 服务器配置为需要令牌以确保安全性,以防第三方使用随机数据发动洪水攻击。
  # 'SECRET_TOKEN': '' 
} 
apm = ElasticAPM(app)  # 将 Flask 应用与 APM 关联在一起的神奇代码行

配置日志

现在,让我们来配置日志,使其可以如上方截图所示与 APM 跟踪信息相关联:

# 在 app.py 中 
fh = logging.FileHandler('foodbankhero.log') 

# 我们之前从 Python 代理导入了自定义格式化程序 
formatter = Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") 
fh.setFormatter(formatter) 
logging.getLogger().addHandler(fh) 

# … 应用中的某个隐蔽位置 ...
logging.getLogger().info(‘Foodbank {} needs {} items’.format(id, len(items))) 
logging.getLogger().info(‘Returning {} foodbank records’.format(len(results)))

以下是您的日志现在将如何呈现的样例:

2020-05-12 01:57:14,029 - flask.app - INFO - 172.22.0.1 - - [12/May/2020 01:57:15] "GET / HTTP/1.1" 200 - | elasticapm transaction.id=f31f884b961a6089 trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

这样设置之后,每个请求的每个日志行都将增加跟踪信息,甚至包括静态资产的请求(在将应用配置为支持静态资产的情况下)。例如:

2020-05-12 01:57:14,029 - werkzeug - INFO - 172.22.0.1 - - [12/May/2020 01:57:14] "GET /favicon.ico HTTP/1.1" 404 - | elasticapm transaction.id=f31f884b961a6089  
trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

亲身体验 Elastic APM

准备好打破传统的孤岛,利用上下文更快地解决问题了吗?运用 Elastic 可观测性,您可以轻松便捷地关联数据并以极快的速度导航到您需要的内容。

了解 Elastic APM 入门的简单方法 - 只需在您的项目中添加几行代码,即可开始向 Elasticsearch 发送数据。通过 Elastic Cloud 上的免费试用,亲身体验将您的日志与 APM 关联起来。