搜索

第 3 章 配置 Java 应用程序

download PDF

要启用 Cryostat 收集、存储和分析 Java Flight Recorder (JFR)数据,有关 Java 虚拟机(JVM)上运行的目标应用程序的数据,您必须配置应用程序,以便 Cryostat 可以检测并连接到它们。

您可以使用以下方法配置应用程序:

  • 通过使用 Cryostat 代理组件进行检测和连接,该代理作为 Java Instrumentation Agent 实施,并充当 JVM 上运行的应用程序的插件
  • 通过将应用程序配置为允许 Java 管理扩展(JMX)连接,并使用 OpenShift Service 检测和 JMX 进行连接
  • 通过使用 Cryostat 代理检测和 JMX 进行连接

Cryostat 代理

Cryostat 代理提供了一个 HTTP API,Cryostat 服务器可用作应用程序 JMX 端口的替代选择。通过将正确配置的 Cryostat 代理附加到您部署的工作负载应用程序中,您可以使用完整的 Cryostat 功能集,而无需目标应用程序公开 JMX 端口。

注意

在 Red Hat build of Cryostat 2.4 之前,Cryostat 代理提供了一个只读 HTTP API,它只支持有限的 JFR 操作。

与 JMX 端口相比,Cryostat 代理的 HTTP API 可以提供以下优点:

  • 由于 API 面区域减少,安全性更高
  • 由于 Cryostat 代理的双角色作为 Cryostat 发现插件,部署灵活性

如果 Cryostat 代理检测到也会在应用程序上配置 JMX,代理会将自身发布到带有代理 HTTP API 定义和 JMX URL 定义的 Cryostat 服务器。在这种情况下,您可以使用您喜欢的任何配置选项。

JVM 的动态附加

从 Cryostat 3.0 开始,Cryostat 代理可以动态地附加正在运行的应用程序 JVM,而无需应用程序重启。这个动态附加功能有以下要求:

  • 您必须确保代理的 JAR 文件被复制到 JVM 的文件系统中(例如,使用 oc cp 命令)。
  • 您必须能够在同一主机上或同一应用程序(例如,使用 oc exec 命令)将代理作为单独的进程运行。

动态附加功能支持临时一次性性能分析或故障排除工作流,您可能不需要在每次 JVM 启动时附加代理。动态附加还适合于无法或不想为附加代理的唯一目的重新配置应用程序的情况。由于代理可以在不需要应用重启的情况下附加到正在运行的 JVM,因此这也意味着没有应用停机时间。

JVM 的静态附件

您可以启用工作负载应用的 JVM,在 JVM 启动时加载和初始化 Cryostat 代理。这个静态附加方法要求您将应用程序配置为将路径为 Cryostat 代理的 JAR 文件(如,  -javaagent:/deployment/app/lib/cryostat-agent.jar)传递-javaagent JVM 标志。在 Cryostat 代理的基本初始化完成后,您的工作负载应用程序的正常启动过程会正常开始。

根据您的工作负载应用程序,静态附加方法可能需要设置一个或多个环境变量,或者在 argLine 参数中添加参数。然而,在某些情况下,您可能需要重新配置、重建并重新部署应用程序。静态附加还需要重启应用程序 JVM,这可能会导致应用程序停机。

注意

在 Cryostat 3.0 之前,通过 -javaagent JVM 标志进行静态附加是启用 Cryostat 代理在目标应用程序上附加和运行的唯一方法。

将代理的 JAR 文件包含到工作负载应用程序中的选项

根据您的要求,您可以以不同的方式将 Cryostat 代理的 JAR 文件包含在工作负载应用程序中:

  • 对于正在运行的 JVM 的动态一次性连接,您可以使用 oc cp 命令将代理的 JAR 文件复制到 JVM 的文件系统中。
  • 对于在启动时对 JVM 的静态附件,您可以使用以下选项之一:

    • 最简单的选项是将 JAR 文件添加到 pom.xmlbuild.gradle 文件中的应用依赖项中。您的构建工具(Maven 或 Gradle)会下载 JAR 文件,以包含在您的应用构建输出中。
    • 您可以使用 Maven 插件(如 maven-dependency-plugin )提供对应用构建输出中下载和包含 JAR 文件的更精细的控制。
    • 您可以创建一个包含 JAR 文件的 PersistentVolume 存储卷。然后,重新配置应用的 Deployment/DeploymentConfig 以挂载 PersistentVolume 和 use -javaagent:/path/to/persistentvolume/cryostat-agent.jar。完成此任务的确切方法取决于您在 OpenShift 集群中启用的 PersistentVolume 供应商类型。

当 Cryostat 代理成功添加到应用程序容器中并载入后,应用程序的 stdout控制台日志 会开始显示 Cryostat 代理中的日志消息。

代理配置属性

您可以通过以下两种方式之一为 Cryostat 代理指定配置属性:

  • 在应用上使用 JVM 系统属性标志(例如,-Dcryostat.agent.api.writes-enabled=true)。
  • 通过将所有字母大写字母组成并将任何标点替换为下划线(例如,CRYOSTAT_AGENT_API_WRITES_ENABLED=true)来使用环境变量。

您必须配置以下属性,以便 Cryostat 代理能够成功运行:

cryostat.agent.baseuri

这将指定 Cryostat 代理向(即内部 OpenShift Service 对象)公告自己(如 https://my-cryostat.my-namespace.svc.cluster.local )的 Cryostat 服务器后端的 URL 位置。

cryostat.agent.callback

这将指定 Cryostat 代理实例或应用程序本身的 URL 位置。Cryostat 使用此 URL 执行健康检查并从代理请求数据。您可以使用 OpenShift/Kubernetes Downward API 动态决定这一点。如需更多信息,请参阅有关 status.podIPKubernetes Downward API 文档

根据您的设置要求,您还可以配置以下代理属性:

cryostat.agent.api.writes-enabled

这表明 Cryostat 代理是否允许写操作。这默认设置为 false。如果您希望 Cryostat 代理接受启动、停止或删除 JFR flight 记录的请求,您必须将此属性设置为 true

注意

即使此属性设置为 false,代理仍然可以履行请求,以列出动态记录或下载单个记录文件。

cryostat.agent.webserver.port

这将指定代理用来绑定其 HTTP API 的 HTTP 端口号(默认为 9977)。如果这与应用程序或其他工具代理使用的现有端口冲突,您必须指定不同的端口号。

cryostat.agent.app.name

这指定了一个标签,用于标识此 Cryostat 代理实例附加到哪个应用程序(默认情况下,cry ostat-agent)。您可以使用 Downward API metadata.namemetadata.labels['app'] 字段。如需更多信息,请参阅 Kubernetes Downward API 文档 Kubernetes Downward API 文档。

远程 Java 管理扩展(JMX)连接

JMX 是 JVM 上的标准功能,您可以使用它监控和管理 JVM 上运行的目标应用程序。要使 Cryostat 使用 JMX,您必须在启动 JVM 时启用和配置 JMX,因为 Cryostat 需要目标应用程序来公开 JMX 端口。

Cryostat 通过此 JMX 端口与目标应用程序通信,以启动和停止 JFR 记录并通过网络拉取 JFR 数据,启用 Cryostat 存储和分析这个 JFR 数据。远程监控需要安全性,以确保未授权的人员无法访问应用程序。Cryostat 会提示您输入您的凭证,然后 Cryostat 可以访问任何应用程序的 JFR 记录。

Cryostat 代理和 JMX 混合

您可以将目标应用程序配置为使用混合方法,其中使用 Cryostat 代理和 JMX。使用此方法,您可以使用 Cryostat 代理来检测目标应用程序和 JMX 来公开 JFR 数据到 Cryostat,从而获得更大的灵活性。

例如,您可以使用代理来检测应用程序,而无需依赖特定的端口号,并使用 JMX 连接根据需要启动和停止 JFR flight 记录。

3.1. 启动 Cryostat 代理作为到 JVM 动态附加的独立进程

如果您希望 Cryostat 代理动态附加到已在运行的应用程序 JVM,您可以将代理作为独立 Java 进程启动。

注意

只有在您想要使用动态附加功能时,这个过程才相关,这允许 Cryostat 代理附加到临时一次性运行的 JVM。如果您希望工作负载的 JVM 在 JVM 启动时加载和初始化 Cryostat 代理,请参阅使用 Cryostat 代理配置应用程序

先决条件

  • 使用 oc cp 命令将代理的 JAR 文件复制到 JVM 的文件系统。

流程

  • 输入以下命令:

    $ java -jar target/<agent_jar_file> <pid>

    在前面的命令中,将 &lt ;agent_jar_file > 替换为代理的 JAR 文件名,并将 <pid > 替换为您要附加到的 JVM 的进程 ID (PID)。

    例如:

    $ java -jar target/cryostat-agent-0.4.0.jar 1234

运行上述命令时,代理进程使用其附加提供程序来查找指定的 PID。如果找到指定的 PID,代理进程会附加到此 PID,并尝试将代理的 JAR 文件加载到此 JVM 中,然后引导到正常的代理启动进程。

基于 PID 值的代理启动行为

根据 PID 值,请考虑以下代理启动行为准则:

  • 如果您指定了无效的 PID,代理将无法成功启动。
  • 如果您将通配符星号(*)指定为 PID 值,代理的 JAR 文件将尝试引导到它找到的每个 JVM。
  • 如果将 0 指定为 PID 值,或者没有指定任何 PID 值,代理会检查是否只有一个 candidate JVM 可用。如果只有一个 JVM 可用,代理会尝试引导到此 JVM。如果多个 JVM 或没有 JVM 可用,代理将无法成功启动。

late-binding 配置选项

当将 Cryostat 代理作为独立进程启动时,您也可以使用命令行选项在代理启动程序中指定额外的 late-binding 配置选项。

例如:

$ java -jar target/cryostat-agent-0.4.0.jar \
-Dcryostat.agent.baseuri=http://cryostat.local \
--smartTrigger=[ProcessCpuLoad>0.2]~profile \
@/deployment/app/moreAgentArgs \
1234

有关可用选项及其行为的更多信息,请运行 java -jar target/cryostat-agent-0.4.0.jar -h help 命令。在注入的代理尝试读取配置值之前,您在主机 JVM 上设置了通过 -D 指定的系统属性。这与在主机 JVM 进程本身上设置这些系统属性或对等环境变量的影响相同。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.