由 Fleet 管理的 APM 服务器
编辑由 Fleet 管理的 APM 服务器
编辑本指南将说明如何设置和配置由 Fleet 管理的 APM 服务器。
先决条件
编辑您需要 Elasticsearch 用于存储和搜索您的数据,以及 Kibana 用于可视化和管理数据。设置这些组件时,您需要
- Elasticsearch 集群和 Kibana(8.16 版或更高版本)以及基本许可证或更高版本的许可证。了解如何在您自己的硬件上安装 Elastic Stack。
- Kibana 和 Elasticsearch 之间的安全加密连接。有关更多信息,请参见 启用安全功能启动 Elastic Stack。
- Kibana 从 Elastic Package Registry 下载集成包所需的互联网连接。确保 Kibana 服务器可以连接到
https://epr.elastic.co
的443
端口。如果您的环境存在网络流量限制,则可以通过多种方法解决此要求。有关更多信息,请参见 隔离环境。 - 拥有 Fleet 和 Integrations 的
所有
权限的 Kibana 用户。由于许多 Integrations 资源在多个空间中共享,因此用户需要在所有空间中拥有 Kibana 权限。 - 在 Elasticsearch 配置中,必须启用 内置 API 密钥服务。(
xpack.security.authc.api_key.enabled: true
) - 在 Kibana 配置中,必须设置已保存对象的加密密钥。Fleet 需要此设置才能保存 API 密钥并在 Kibana 中对其进行加密。您可以将
xpack.encryptedSavedObjects.encryptionKey
设置为至少 32 个字符的字母数字值,或者运行kibana-encryption-keys
命令 来生成密钥。
示例安全设置
出于测试目的,您可以使用以下设置快速入门,但在发送真实数据之前,请确保正确保护 Elastic Stack。
elasticsearch.yml 示例
xpack.security.enabled: true xpack.security.authc.api_key.enabled: true
kibana.yml 示例
elasticsearch.username: "kibana_system" xpack.encryptedSavedObjects.encryptionKey: "something_at_least_32_characters"
密码应按照 Elasticsearch 安全文档 中的说明存储在 Kibana 密钥库中。 |
步骤 1:设置 Fleet
编辑在 Kibana 中使用 Fleet 将 APM 数据导入 Elastic Stack。首次使用 Fleet 时,您需要设置它并添加 Fleet 服务器
要部署自托管的 Fleet 服务器,您需要安装 Elastic Agent 并将其注册到包含 Fleet 服务器集成的代理策略中。
每个主机只能安装一个 Elastic Agent,这意味着您不能在同一主机上运行 Fleet 服务器和另一个 Elastic Agent,除非您部署容器化的 Fleet 服务器。
- 在 Fleet 中,打开 设置 选项卡。有关这些设置的更多信息,请参见 Fleet 设置。
-
在 Fleet 服务器主机 下,单击 编辑主机 并指定 Elastic Agent 将用于连接到 Fleet 服务器的一个或多个主机 URL。例如,
https://192.0.2.1:8220
,其中192.0.2.1
是您将在其中安装 Fleet 服务器的主机 IP。保存并应用您的设置。如果 编辑主机 选项呈灰色显示,则 Fleet 服务器主机是在 Fleet 外部配置的。有关更多信息,请参阅 Kibana 中的 Fleet 设置。
- 在 Elasticsearch 主机 字段中,指定 Elastic Agent 将发送数据的 Elasticsearch URL。例如,
https://192.0.2.0:9200
。如果您已启用安全功能启动 Elastic Stack,请跳过此步骤(您无法更改此设置,因为它是在 Fleet 外部管理的)。 - 保存并应用设置。
-
单击 代理 选项卡,并按照产品内的说明添加 Fleet 服务器
注释
- 如果您希望 Fleet 为您生成 Fleet 服务器策略和注册令牌,请选择 快速入门。Fleet 服务器策略将包含 Fleet 服务器集成以及用于监控 Elastic Agent 的系统集成。此选项会生成自签名证书,不建议用于生产用例。
-
如果您希望:
- 使用您自己的 Fleet 服务器策略。您可以创建一个新的 Fleet 服务器策略或选择一个现有的策略。或者,您可以 无需使用 UI 创建 Fleet 服务器策略,然后在此处选择该策略。
- 使用您自己的 TLS 证书来加密 Elastic Agent 和 Fleet 服务器之间的流量。要了解如何生成证书,请参阅 为自托管 Fleet 服务器配置 SSL/TLS。
- 建议您为每个 Fleet 服务器生成一个唯一的服务令牌。有关生成服务令牌的其他方法,请参见
elasticsearch-service-tokens
。 -
如果您提供自己的证书
- 运行
install
命令之前,请确保替换尖括号中的值。 - 请注意,
--url
指定的 URL 必须与用于生成--fleet-server-cert
指定的证书的 DNS 名称匹配。
- 运行
install
命令将 Elastic Agent 安装为托管服务,并将其注册到 Fleet 服务器策略中。有关更多 Fleet 服务器命令,请参见 Elastic Agent 命令参考。
如果安装成功,您将看到 Fleet 服务器已连接的确认信息。单击 继续注册 Elastic Agent 以开始将您的代理注册到 Fleet 服务器。
如果您无法添加由 Fleet 管理的代理,请单击 代理 选项卡,并确认运行 Fleet 服务器的代理是否正常。
有关更多信息,请参阅 Fleet 服务器。
步骤 2:添加和配置 APM 集成
编辑- 在 Kibana 中,在主菜单中查找 集成,或使用 全局搜索字段。
-
选择 Elastic APM。
-
单击 添加 Elastic APM。
-
在 添加 Elastic APM 集成 页面上,定义 APM 服务器将侦听的主机和端口。记下此值,以后您将需要它。
使用 Docker 或 Kubernetes?将主机设置为
0.0.0.0
以绑定到所有接口。 - 在 代理授权 下,设置一个密钥令牌。这将用于授权来自 APM 代理到 APM 服务器的请求。记下此值,以后您将需要它。
- 单击 保存并继续。此步骤大约需要一到两分钟才能完成。完成后,您将拥有一个代理策略,其中包含为您刚刚指定的配置创建的 APM 集成策略。
-
要查看新策略,请单击 代理策略 1。
分配给此策略的任何 Elastic Agent 都将从您已检测的服务收集 APM 数据。
步骤 3:安装 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 更改同步项目后,需要在您的 Application 类 中初始化 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 默认情况下处于禁用状态。通过将 Enable 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 集成。
步骤 4:查看您的数据
编辑回到 Kibana,在“可观察性”下选择 APM。您应该会看到应用程序性能监控数据流入 Elastic Stack!