应用程序跟踪和 APM 入门
编辑应用程序跟踪和 APM 入门编辑
本指南介绍如何
- 收集应用程序性能监控 (APM) 数据
- 将 APM 数据发送到 Elastic Stack
- 实时探索和可视化数据
如有反馈和问题,请在 论坛 中联系我们。
先决条件编辑
要按照本指南中的步骤操作,您需要一个包含以下内容的 Elastic Stack 部署:
- 用于存储和搜索数据的 Elasticsearch
- 用于可视化和管理数据的 Kibana
- 对 Fleet 和 Integrations 具有
所有
权限的 Kibana 用户。由于许多 Integrations 资产在空间之间共享,因此用户需要在所有空间中都拥有 Kibana 权限。 - Integrations Server(默认包含在每个 Elasticsearch Service 部署中)
要快速入门,请启动我们托管的 Elasticsearch Service 的部署。Elasticsearch Service 在 AWS、GCP 和 Azure 上可用。免费试用。
步骤 1:配置 APM 集成编辑
Elastic Cloud 运行 Integrations Server 的托管版本,其中包括 APM 集成。
-
在 Kibana 中,导航到 Fleet > 代理策略 并选择 Elastic Cloud 代理策略。这是 Elastic Cloud 上托管的 Elastic 代理的默认代理策略。
-
在 操作 列的 Elastic APM 旁边,选择 编辑集成 以配置 APM 集成。
- 记下 APM 服务器正在侦听的预定义 URL,您将在下一步中用到它。
- 如果您对配置进行了任何更改,请单击 保存并继续。
步骤 2:安装 APM 代理编辑
APM 代理使用与您的服务相同的语言编写。要监控新服务,您必须安装代理并使用服务名称、APM 服务器主机和密钥令牌对其进行配置。
-
服务名称:APM 集成将每个 APM 代理配置中定义的已检测服务的名称映射到其数据存储在 Elasticsearch 中的索引。服务名称不区分大小写,并且必须唯一。例如,您不能拥有一个名为
Foo
的服务和另一个名为foo
的服务。特殊字符将从服务名称中删除,并替换为下划线 (_
)。 - APM 服务器 URL:APM 服务器侦听事件的主机和端口。这应与设置 APM 集成时定义的主机和端口匹配。
- 密钥令牌:APM 代理和 APM 服务器通信的身份验证方法。这应与设置 APM 集成时定义的密钥令牌匹配。
如果需要更改 APM 服务器 URL 或密钥令牌以匹配您的 APM 代理,您可以编辑 APM 集成设置。
1. 将代理添加到您的项目中
首先,将 Elastic APM 代理插件 添加到您的应用程序的 build.gradle
文件中,如下所示
// Android app's build.gradle file plugins { id "com.android.application" id "co.elastic.apm.android" version "[latest_version]" }
2. 配置代理
添加代理插件后,对其进行配置。最小配置设置 Elastic APM 集成端点,如下所示
// Android app's build.gradle file plugins { //... id "co.elastic.apm.android" version "[latest_version]" } elasticApm { // Minimal configuration serverUrl = "https://your.elastic.server" // Optional serviceName = "your app name" serviceVersion = "0.0.0" apiKey = "your server api key" secretToken = "your server auth token" }
您可以在 Gradle 插件门户 中找到最新版本。 |
|
默认为您的 |
|
默认为您的 |
|
默认为 null。有关 API 密钥的更多信息,请参见此处。 |
|
默认为 null。 |
当同时提供 secretToken
和 apiKey
时,apiKey 优先,secretToken 被忽略。
3. 初始化代理
在使用上述 Gradle 更改同步您的项目后,需要在您的 应用程序类 中初始化 Elastic APM 代理。此示例显示了配置代理的最简单方法
// Your Application class class MyApp extends android.app.Application { @Override public void onCreate() { super.onCreate(); ElasticApmAgent.initialize(this); } }
剩下的就是编译并运行您的应用程序。就是这样!
在代理参考中了解更多信息
在 APM Android 代理参考 中阅读更多信息。
1. 安装代理
使用 go get
安装 Elastic APM Go 代理包
go get -u go.elastic.co/apm/v2
2. 配置代理
为了简化开发和测试,代理默认将数据发送到 https://127.0.0.1:8200
的 Elastic APM 集成。要将数据发送到备用位置,您必须配置 ELASTIC_APM_SERVER_URL
。
# The APM integration host and port export ELASTIC_APM_SERVER_URL= # If you do not specify `ELASTIC_APM_SERVICE_NAME`, the Go agent will use the # executable name. For example, if your executable is called "my-app.exe", then your # service will be identified as "my-app". export ELASTIC_APM_SERVICE_NAME= # Secret tokens are used to authorize requests to the APM integration export ELASTIC_APM_SECRET_TOKEN=
3. 检测您的应用程序
检测是扩展应用程序代码以将跟踪数据报告给 Elastic APM 的过程。Go 应用程序必须在源代码级别手动检测。要检测您的应用程序,请使用以下方法之一
在代理参考中了解更多信息
1. 将代理依赖项添加到您的项目中
将 Elastic APM iOS 代理添加到您的 Xcode 项目或 Package.swift
中。
以下是将 包依赖项 添加到标准 Xcode 项目的说明。
有关将依赖项添加到 Package.swift
的详细信息,请参阅 将依赖项添加到另一个 Swift 包。这是一个有用的代码片段
Package( dependencies:[ .package(name: "apm-agent-ios", url: "https://github.com/elastic/apm-agent-ios.git", from: "1.0.0"), ], targets:[ .target( name: "MyApp", dependencies: [ .product(name: "ElasticApm", package: "apm-agent-ios") ] ), ])
2. 初始化代理
如果您使用 SwiftUI
构建应用程序,请将以下内容添加到您的 App.swift
中
import SwiftUI import ElasticApm class AppDelegate : NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { var config = AgentConfigBuilder() .withServerUrl(URL(string:"http://127.0.0.1:8200")) .withSecretToken("<SecretToken>") .build() ElasticApmAgent.start(with: config) return true } } @main struct MyApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate init() { } var body: some Scene { WindowGroup { ContentView() } } }
如果您没有使用 SwiftUI
,您也可以将相同的内容添加到您的 AppDelegate.swift
文件中
import UIKit import ElasticApm @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { var config = AgentConfigBuilder() .withServerUrl(URL(string:"http://127.0.0.1:8200")) .withSecretToken("<SecretToken>") .build() ElasticApmAgent.start(with: config) return true } }
在代理参考中了解更多信息
在 APM iOS 代理参考 中阅读更多信息。
使用 -javaagent
JVM 选项手动设置和配置代理。不需要更改应用程序代码,但这需要重新启动应用程序。有关此设置方法的更多信息,请参见下文。
1. 下载 APM 代理
Elastic APM Java 代理入门的第一个步骤是检索代理 JAR 的副本。Java 代理版本发布到 Maven 中央存储库。为了获得副本,您可以
2. 添加 -javaagent
标志
启动应用程序时,添加 JVM 标志 -javaagent:/path/to/elastic-apm-agent-<version>.jar
3. 配置
不同的应用程序服务器有不同的设置 -javaagent
标志和系统属性的方法。启动您的应用程序(例如 Spring Boot 应用程序或其他嵌入式服务器)并添加 -javaagent
JVM 标志。使用 -D
前缀使用系统属性配置代理
java -javaagent:/path/to/elastic-apm-agent-<version>.jar -Delastic.apm.service_name=my-cool-service -Delastic.apm.application_packages=org.example,org.another.example -Delastic.apm.server_url=http://127.0.0.1:8200 -jar my-application.jar
有关更多信息,请参阅 使用 -javaagent
标志进行手动设置。
备用设置方法
设置 APM 代理
可以通过几种不同的方式将 .NET 代理添加到应用程序中
- 探查器运行时检测:代理支持自动检测,无需任何代码更改,也无需重新编译您的项目。请参阅 探查器自动检测。
- NuGet 包:代理作为一组 NuGet 包 提供,可在 nuget.org 上获得。您可以通过引用一个或多个这些包并遵循包文档,将代理和特定检测添加到 .NET 应用程序中。
- 主机启动挂钩:在 .NET Core 3.0+ 或 .NET 5+ 上,代理支持自动检测,无需任何代码更改,也无需重新编译您的项目。有关更多详细信息,请参阅 在 .NET Core 上进行零代码更改设置。
在代理参考中了解更多信息
1. 安装 APM 代理
将 Node.js 的 APM 代理作为依赖项安装到您的应用程序中。
npm install elastic-apm-node --save
2. 初始化
重要的是,代理必须在您的 Node.js 应用程序中需要 任何 其他模块之前启动 - 即在 http
和您的路由器等之前。
这意味着您应该在应用程序的主文件中(通常是 index.js
、server.js
或 app.js
)引入并启动代理。
以下是一个如何引入和启动 Elastic APM 的简单示例
// Add this to the VERY top of the first file loaded in your app var apm = require('elastic-apm-node').start({ // Override service name from package.json // Allowed characters: a-z, A-Z, 0-9, -, _, and space serviceName: '', // Use if APM integration requires a token secretToken: '', // Use if APM integration uses API keys for authentication apiKey: '', // Set custom APM integration host and port (default: http://127.0.0.1:8200) serverUrl: '', })
代理现在将监控您的应用程序的性能并记录任何未捕获的异常。
在代理参考中了解更多信息
1. 安装代理
使用 支持平台的软件包 之一安装代理。
使用 RPM 软件包(RHEL/CentOS 和 Fedora)
rpm -ivh <package-file>.rpm
使用 DEB 软件包(Debian 和 Ubuntu)
dpkg -i <package-file>.deb
使用 APK 软件包(Alpine)
apk add --allow-untrusted <package-file>.apk
如果找不到您的发行版,则可以通过从源代码构建代理来安装它。以下说明将使用 Elastic 用于构建官方软件包的相同 Docker 环境来构建 APM 代理。
该代理目前仅适用于 Linux 操作系统。
- 从 https://github.com/elastic/apm-agent-php/ 下载代理源代码。
- 执行以下命令以构建代理并安装它
cd apm-agent-php # for linux glibc - libc distributions (Ubuntu, Redhat, etc) export BUILD_ARCHITECTURE=linux-x86-64 # for linux with musl - libc distributions (Alpine) export BUILD_ARCHITECTURE=linuxmusl-x86-64 # provide a path to php-config tool export PHP_CONFIG=php-config # build extensions make -f .ci/Makefile build # run extension tests PHP_VERSION=`$PHP_CONFIG --version | cut -d'.' -f 1,2` make -f .ci/Makefile run-phpt-tests # install agent extensions sudo cp agent/native/_build/${BUILD_ARCHITECTURE}-release/ext/elastic_apm-*.so `$PHP_CONFIG --extension-dir` # install automatic loader sudo cp agent/native/_build/${BUILD_ARCHITECTURE}-release/loader/code/elastic_apm_loader.so `$PHP_CONFIG --extension-dir`
2. 启用和配置 APM 代理
在 php.ini
文件中启用和配置您的代理
extension=elastic_apm_loader.so elastic_apm.bootstrap_php_part_file=<repo root>/agent/php/bootstrap_php_part.php
在代理参考中了解更多信息
- Django
-
1. 安装 APM 代理
将 Python 版 APM 代理作为依赖项安装。
$ pip install elastic-apm
2. 配置代理
代理是在您的应用程序进程中运行的库。APM 服务是根据
SERVICE_NAME
以编程方式创建的。# Add the agent to the installed apps INSTALLED_APPS = ( 'elasticapm.contrib.django', # ... ) ELASTIC_APM = { # Set required service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space 'SERVICE_NAME': '', # Use if APM integration requires a token 'SECRET_TOKEN': '', # Set custom APM integration host and port (default: https://127.0.0.1:8200) 'SERVER_URL': '', } # To send performance metrics, add our tracing middleware: MIDDLEWARE = ( 'elasticapm.contrib.django.middleware.TracingMiddleware', #... )
- Flask
-
1. 安装 APM 代理
将 Python 版 APM 代理作为依赖项安装。
$ pip install elastic-apm[flask]
2. 配置代理
代理是在您的应用程序进程中运行的库。APM 服务是根据
SERVICE_NAME
以编程方式创建的。# initialize using environment variables from elasticapm.contrib.flask import ElasticAPM app = Flask(__name__) apm = ElasticAPM(app) # or configure to use ELASTIC_APM in your application settings from elasticapm.contrib.flask import ElasticAPM app.config['ELASTIC_APM'] = { # Set required service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space 'SERVICE_NAME': '', # Use if APM integration requires a token 'SECRET_TOKEN': '', # Set custom APM integration host and port (default: https://127.0.0.1:8200) 'SERVER_URL': '', } apm = ElasticAPM(app)
在代理参考中了解更多信息
1. 安装 APM 代理
将代理添加到您的 Gemfile 中。
gem 'elastic-apm'
2. 配置代理
- Ruby on Rails
-
APM 在您的应用程序启动时自动启动。通过创建配置文件
config/elastic_apm.yml
来配置代理# config/elastic_apm.yml: # Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space # Defaults to the name of your Rails app service_name: 'my-service' # Use if APM integration requires a token secret_token: '' # Set custom APM integration host and port (default: https://127.0.0.1:8200) server_url: 'https://127.0.0.1:8200'
- Rack
-
对于 Rack 或兼容的框架(如 Sinatra),请在您的应用程序中包含中间件并启动代理。
# config.ru app = lambda do |env| [200, {'Content-Type' => 'text/plain'}, ['ok']] end # Wraps all requests in transactions and reports exceptions use ElasticAPM::Middleware # Start an instance of the Agent ElasticAPM.start(service_name: 'NothingButRack') run app # Gracefully stop the agent when process exits. # Makes sure any pending transactions are sent. at_exit { ElasticAPM.stop }
创建配置文件
创建配置文件 config/elastic_apm.yml
# config/elastic_apm.yml: # Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space # Defaults to the name of your Rack app's class. service_name: 'my-service' # Use if APM integration requires a token secret_token: '' # Set custom APM integration host and port (default: https://127.0.0.1:8200) server_url: 'https://127.0.0.1:8200'
在代理参考中了解更多信息
1. 启用真实用户监控 (RUM)
RUM 默认情况下处于禁用状态。通过将 启用 RUM
设置为 true
来启用它。
2. 设置代理
使用 <script>
标签或使用捆绑器设置代理。
同步/阻塞模式
添加一个 <script> 标签来加载捆绑包,并使用 elasticApm
全局对象来初始化代理
<script src="https://<your-cdn-host>.com/path/to/elastic-apm-rum.umd.min-<version>.js" crossorigin></script> <script> elasticApm.init({ serviceName: '<instrumented-app>', serverUrl: '<apm-server-url>', }) </script>
异步/非阻塞模式
异步加载脚本可确保代理脚本不会阻塞页面上的其他资源,但是,它仍然会阻塞浏览器的 onload
事件。
<script> ;(function(d, s, c) { var j = d.createElement(s), t = d.getElementsByTagName(s)[0] j.src = 'https://<your-cdn-host>.com/path/to/elastic-apm-rum.umd.min-<version>.js' j.onload = function() {elasticApm.init(c)} t.parentNode.insertBefore(j, t) })(document, 'script', {serviceName: '<instrumented-app>', serverUrl: '<apm-server-url>'}) </script>
使用捆绑器
将真实用户监控 APM 代理作为依赖项安装到您的应用程序中
npm install @elastic/apm-rum --save
配置代理
import { init as initApm } from '@elastic/apm-rum' const apm = initApm({ // Set required service name (allowed characters: a-z, A-Z, 0-9, -, _, and space) serviceName: '', // Set custom APM integration host and port (default: https://127.0.0.1:8200) serverUrl: 'https://127.0.0.1:8200', // Set service version (required for sourcemap feature) serviceVersion: '' })
在代理参考中了解更多信息
Elastic 与 OpenTelemetry 集成,允许您重用现有的仪器来轻松地将可观察性数据发送到 Elastic Stack。
有关如何组合 Elastic 和 OpenTelemetry 的更多信息,请参阅 OpenTelemetry 集成。
步骤 3:查看您的数据编辑
返回 Kibana,在“可观察性”下,选择“APM”。您应该会看到应用程序性能监控数据流入 Elastic Stack!
内置的 apm_user
角色与 APM 集成不兼容,因为它只提供对 apm-*
索引的读取访问权限。有关用户需要访问的索引列表,请参阅 APM 数据流
没有看到任何数据?查看我们的 常见问题 列表以获取有用提示。
下一步是什么?编辑
- 现在数据正在流入 Elastic Stack,请将您的调查提升到更深的层次!使用 Elastic 可观察性 来统一您的日志、指标、正常运行时间和应用程序性能数据。
- 想要保护您的端点免受安全威胁?试试 Elastic 安全。添加端点保护只是您添加到代理策略的另一个集成!
- 您的眼睛是否因为盯着屏幕墙而感到疲惫?创建警报 并在池畔啜饮您最喜欢的饮料时发现问题。
- 希望 Elastic 来完成繁重的工作?使用机器学习来 检测异常。
- 一切都按您的意愿工作了吗?通过在您的基础架构中部署 Elastic 代理,将您的代理策略推广到其他主机!