Observability:在 Elastic Observability 部署中添加免费和开放的 Elastic APM

2021年5月17日   |   by mebius

在最近的一篇文章中,我们向你展示了如何开始使用 Elastic Observability 的免费开放层。 今天,我们将逐步介绍扩展部署所需的操作,以便你可以免费从应用程序性能监视(APM)或 “可观测性” 群集中的 “跟踪” 数据中收集指标。

什么是 APM?

通过应用程序性能监视,你可以查看应用程序在哪里花费的时间,它们在做什么,它们在调用什么其他应用程序或服务以及遇到什么错误或异常。

%title插图%num

此外,APM 还使你可以查看关键性能指标的历史和趋势,例如延迟和吞吐量,以及事务和相关性信息:

%title插图%num

无论你是针对违反 SLA 的行为设置警报,尝试评估最新版本的影响,还是决定下一步的改进,APM 都可以帮助你进行根本原因分析,以帮助改善用户体验并推动你的发展平均解决时间(MTTR)接近零。

逻辑架构

Elastic APM 依赖于 APM 服务器,该服务器将应用程序跟踪和指标数据从装有 APM 代理的应用程序转发到 Elastic Observability 集群。 Elastic APM 支持多种不同的代理风格:

%title插图%num

在此博客中,我们将提供一个简单的示例,说明如何使用本机 Elastic APM Ruby 代理检测代码,但是其他语言的总体步骤相似。

设置 APM 服务器

APM 服务器将跟踪和应用程序指标数据从 APM 代理转发到 Elasticsearch。 要将 APM 数据添加到你的 Elastic Observability 集群中,我们可以按照 Kibana 中的高级说明进行操作。 在 Kibana 里,它将检测你是在 Elastic Cloud(我们的托管 Elasticsearch 服务)中运行还是在运行自我管理的集群。 就我而言,它是自我管理的。 一旦我们确认Elasticsearch 和 Kibana 正在运行,就可以连接到我们的 Kibana 实例。 如果你不记得 Kibana URL,则可以在 Kibana 日志的开头找到它。 例如,我的有:

log   [07:30:58.643] [info][server][Kibana][http] http server running at https://192.168.1.175:5601

登录到 Kibana 后(在我的情况下,使用 elastic/password),单击 “汉堡包(Elastic Logo %title插图%num)”,然后从主菜单中选择 APM,导航到 APM 应用程序:

%title插图%num

Kibana 检测到尚无任何 APM 数据,并通过指示链接提示我:

%title插图%num

从那里开始,它提供了一系列步骤。

%title插图%num

我们将严格按照说明进行操作; 我使用的是自签名证书,因此我需要执行一些额外的步骤,但是大概步骤是相同的​​。

  • 下载 APM 服务器
  • 将 APM 服务器连接到 Elasticsearch
  • 将代理连接到 APM 服务器

步骤1:下载APM服务器

Elastic APM 和 APM Server 是 Elastic Observability 的免费和开放层的一部分-如果你愿意,可以下载源代码,如果要进行增强则可以提交 PR (pull request),或者在遇到问题时可以提交问题

按照 Kibana 中的说明,我们从与操作系统匹配的说明开始。 我在 Mac 上运行,因此我将按照这些说明进行设置。 第一步,我们下载了APM Server tarball(或所选操作系统系列使用的任何安装包类型)并进行安装。 对于 MacOS,这只是意味着将其解压缩并更改为新创建的目录:

curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-7.12.0-darwin-x86_64.tar.gz 
tar xzvf apm-server-7.12.0-darwin-x86_64.tar.gz 
cd apm-server-7.12.0-darwin-x86_64/

进入 apm-server-7.12.0-darwin-x86_64 目录后,我们会看到一些文件:

~/elk/apm-server-7.12.0-darwin-x86_64 $ >ls -lF  
total 132724 
-rw-r--r--  1 jamie  staff    13K Mar 18 01:07 LICENSE.txt 
-rw-r--r--  1 jamie  staff   1.1M Mar 18 01:07 NOTICE.txt 
-rw-r--r--  1 jamie  staff   661B Mar 18 01:29 README.md 
-rwxr-xr-x  1 jamie  staff   123M Mar 18 03:11 apm-server* 
-rw-------  1 jamie  staff    52K Mar 18 01:08 apm-server.yml 
-rw-r--r--  1 jamie  staff   323K Mar 18 01:08 fields.yml 
drwxr-xr-x  3 jamie  staff    96B Mar 18 01:08 ingest/

包括一些文档,字段规范,配置文件和 APM Server 可执行文件。

步骤2:编辑APM服务器配置

这是我们将略微偏离说明的地方。 我们仍将设置 Elasticsearch 输出部分:

output.elasticsearch: 
  hosts: [""] 
  username:  
  password: 

但是,由于 Elasticsearch 使用的是自签名证书,因此我们也需要对其进行配置。

就我而言,Elasticsearch 正在监听 “https://192.168.1.175:9200″,因此我们将使用它来设置值对于 hosts 和 protocol keys:

output.elasticsearch: 
  hosts: ["192.168.1.175:9200"] 
  protocol: "https"

我们可以使用 elastic 用户将 APM 服务器连接到 Elasticsearch,但是 APM 服务器不需要超级用户特权。 我将创建一个角色,该角色具有工作所需的最少特权,并将其称为apm_server。 我们在 Kibana 的 “Security Management” 部分中进行了此操作。 要到达那里,请单击 Kibana 左上方的汉堡包图标,然后导航到 “Stack Management”,我们在其中找到 Security 部分。 单击角色,然后单击创建角色,然后添加 apm_server 角色:

%title插图%num

然后保存。 接下来,选择 “User”→“Create user”,然后添加 apm_server_user:

%title插图%num

当然,你可以为角色和用户使用自己的名称,或者如上所述,仅对 elastic 用户进行试验。

接下来,我们还将要使用的用户名和密码的凭据添加到配置中,因此现在看起来像这样:

output.elasticsearch: 
  hosts: ["192.168.1.175:9200"] 
  protocol: "https" 
  username: "apm_server_user" 
  password: "password"

我们即将能够启动 APM 服务器,但是如果这样做,我们将遇到有关由未知授权机构签署的证书的错误:

./apm-server -e {“log.level”:”error”,”@timestamp”:”2021-04-27T13:21:51.497-0400″,”log.logger”:”publisher_pipeline_output”,”log.origin”:{“file.name”:”pipeline/output.go”,”file.line”:154},”message”:”Failed to connect to backoff(elasticsearch(https://192.168.1.175:9200)): Get “https://192.168.1.175:9200″: x509: certificate signed by unknown authority”,”ecs.version”:”1.6.0″}

为了减轻这种情况,我们需要向 APM 服务器告知我们的证书颁发机构,对我而言,该证书颁发机构位于 ~/elk/elasticsearch 文件夹下。 首先,我们将 ca.crt 复制到 APM Server 的目录层次结构中(我们可以通过它现在的位置来引用位于 elasticsearch 目录下的证书,但是在现实世界中,你可能会在不同的主机上运行每个服务):

/Users/liuxg/elk/apm-server-7.12.0-darwin-x86_64
mkdir certs
cp ~/elk/elasticsearch/ca/ca.crt certs/

然后,通过向 apm_server.yml 的 elasticsearch.output 部分添加另一个密钥,将新的 ca.crt 指定为授权:

output.elasticsearch: 
  hosts: ["192.168.1.175:9200"] 
  protocol: "https" 
  username: "elastic" 
  password: "ThisIsTooEasy" 
  ssl.certificate_authorities: ["certs/ca.crt"]

步骤3:启动APM服务器

我们现在可以启动 APM Server,它将连接到 Elasticsearch,但是现在它仅在 localhost 上侦听。 我想对配置进行更多更改,以便它侦听主机 IP 而不是本地主机,以便防火墙后面的其他主机可以访问它。 在 apm-server.yml 文件顶部附近,有一个地方可以做到这一点。 我的 APM 服务器将与其他设备在同一台计算机上运行,​​因此我将使用相同tgcode的 192.168.1.175 地址,现在的配置如下所示:

apm-server: 
  # Defines the host and port the server is listening on. Use "unix:/path/to.sock" to listen on a unix domain socket.               
  host: "192.168.1.175:8200"

我们最终可以使用 ./apm-server -e 启动 APM 服务器(-e 使其运行的日志输出到 console 中,这对于启动时很有用)。

如果我们回到 Kibana,则 APM 应用程序中仍然没有任何显示,但是有一个小按钮 Check APM Server Status。 单击该按钮查看你是否得到信息 You have correctly set up APM Server

%title插图%num

你可能还已经注意到,状态检查下面还有一个关于 APM 代理的部分:

%title插图%num

让我们在那里获取一些实际的数据!

使用 Elastic APM 代理插桩示例代码

各种语言代理的指令根据编程语言而有所不同,但从总体上讲,其流程类似。 首先,在语言的本机规范中添加代理的依赖关系,然后配置代理以使其了解如何查找 APM 服务器。

你可以尝试任何喜欢的口味,但是我将使用我发现的完整的 Ruby 示例来逐步了解 Ruby on Rails 的说明。 我确实遇到了一个问题,无法运行该示例,事实证明这是与此类似的引导缓存问题,此问题已通过在我的 docker 文件中添加一行来解决:

volumes: 
      - .:/app 
      # don't mount tmp directory 
      - /app/tmp

这包含在上述存储库的 fork 中。

获取示例代码(或使用你自己的代码)

首先,克隆 GitHub 存储库,然后转到目录:

git clone htgcodettps://github.com/jamiesmith/docker-rails-example.git 
cd docker-rails-example

(如果你没有安装 git,则只需下载一个 zip 文件并将其展开)

添加依赖项

按照说明,我编辑项目的依赖关系规范(对于Ruby,这就是 Gemfile),并添加 gem ‘elastic-apm’。你可以在上面tgcode克隆的项目的根目录中发现一个叫做 Gemfile 的文件:

$ pwd
/Users/liuxg/elk/docker-rails-example
$ ls Gemfile
Gemfile

我只是把它扔在顶部附近:

source 'https://rubygems.org' 
git_source(:github) { |repo| "https://github.com/#{repo}.git" } 
ruby '2.7.2' 
# enable Elastic APM 
gem 'elastic-apm' 
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 
gem 'rails', '~> 6.1.0'

在上面,我们添加了 gem ‘elastic-apm’ 这一行。保存文件,然后继续下一步,配置代理。请注意,完整的 Gemfile 作为 Gemfile.elastic-apm 包含在存储库中。

配置代理

代理需要将应用程序跟踪数据发送到 APM 服务器,并且必须做到这一点。 如果你还记得的话,我们的配置为侦听主机的 IP,因此我们子网中的任何内容都可以向其发送数据。 我们需要向项目添加另一个文件,该文件将在启动时被拾取。 在项目顶部的 config 目录下创建一个新文件,并添加与文档类似的以下内容并添加注释:

config/elastic_apm.yml

service_name: 'my-service'

# Use if APM Server requires a secret token
# secret_token: ''

# Set the custom APM Server URL (default: http://localhost:8200)
# server_url: 'http://:8200'
server_url: 'http://192.168.1.175:8200'

# Set the service environment
environment: 'production'

关于以上内容的一些评论:

  • service_name:如果省略此名称,它将仅默认为应用程序的名称,但是你可以在此处覆盖该名称。
  • secret_token:秘密令牌允许你授权对 APM 服务器的请求,但要求使用 SSL/TLS 设置 APM 服务器,并且已经设置了秘密令牌。 我们不在代理和 APM 服务器之间使用HTTPS,因此我们将其注释掉。
  • server_url:这是代理可以访问 APM 服务器的方式,将其替换为主机的名称或 IP。
  • environment:这允许你将元数据添加到服务中。 例如,你可能在质量检查中有一个版本,而在生产中又有一个版本。

请注意,示例配置文件以 config/elastic_apm.yml.elastic-apm 的形式包含在存储库中。

现在已经完成了配置的弹性 APM 端,我们只需按照自述文件中的步骤进行启动。 我们复制两个文件,然后生成并运行:

cp .env.example .env 
cp docker-compose.override.yml.example docker-compose.override.yml 
docker-compose up --build

构建步骤将花费几分钟。 完成后,在同一目录的另一个终端窗口中,运行:

./run rails db:setup

来设置初始数据库。

你可以通过访问 http://localhost:8000http://localhost:8000/up 导航到正在运行的示例应用程序。 该示例没有太多内容,但它确实会生成一些 APM 数据。 要产生一点负载,你可以将它们重新加载几次,或运行一个快速的小脚本:

while [ 1 ] 
do 
    curl localhost:8000/up 
    curl localhost:8000  
    sleep 1  
done

它将每秒重新加载页面。

返回 Kibana,导航回 APM 应用程序(汉堡图标,然后选择 APM),你将看到我们的 my-service:

%title插图%num

“Sevice Overview” 页面提供了一个服务运行状况摘要。如果你是开发人员或 SRE,则此页面将帮助你回答以下问题:

  • 新部署如何影响性能?
  • 影响最大的交易是什么?
  • 性能如何与基础架构相关联?

该视图提供了在指定时间段(在本例中为最后15分钟)内已将应用程序跟踪数据发送到 Elastic APM 的所有应用程序的列表。也有迷你图显示了延迟,吞吐量和错误率的微型图。单击 my-service 将带我们进入服务概述页面,该页面显示了服务内的各种事务(请注意,我的脚本正在访问 / /up 端点,这是 PageController 的一部分,在 Transactions 部分中看到)。我们获得了更大的延迟,吞吐量,错误和错误率(没有错误)图表,并列出了该服务所依赖的服务和应用程序,在这种情况下,它所依赖的唯一服务是 Postgres:

%title插图%num

在测试实际应用程序时,在实际负载下,你会看到更多的连接性(以及错误!)。

%title插图%num

在事务视图中单击事务,在本例中为示例应用程序的 PagesController#up 事务,我们可以确切地看到被调用的操作:

%title插图%num

但是,通过调用其他微服务和外部服务的更复杂的事务,我们可以看到更多详细信息:

%title插图%num

包括有关调用外部服务(例如数据库查询)的详细信息:

%title插图%num

下一步是什么?

既然你已经启动并运行了 Elastic Observability 集群并收集了现成的应用程序跟踪数据,请探索应用程序所使用语言的公共 API,从而使你可以将 APM 数据用于下一个级别。 使用API​​,你可以添加自定义元数据,定义业务交易,创建自定义范围等。 你可以在 APM 代理程序文档页面上找到各种 APM 代理程序(例如 JavaRuby 等)的公共 API 规范。 如果你想了解有关 Elastic APM 的更多信息,请查看我们在 Elastic APM 上的网络研讨会,转向向云原生迁移,以了解 Elastic APM 在你的生态系统中可以为你提供帮助的其他方式。

如果你决定让我们托管您的可观察性集群,则可以注册 Elastic Cloud 上的 Elasticsearch Service 的免费试用版,并更改代理以指向你的新集群。

文章来源于互联网:Observability:在 Elastic Observability 部署中添加免费和开放的 Elastic APM