搜索

第 3 章 配置 Java 应用程序

download PDF

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

您可以通过以下任一方式配置应用程序:

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

Cryostat 代理

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

注意

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

Cryostat 代理的 HTTP API 与 JMX 端口相比有以下优点:

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

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

要将 Cryostat 代理与工作负载应用程序搭配使用,您必须将应用程序配置为使用 Cryostat 代理的 JAR 文件的路径传递 -javaagent JVM 标志(例如 -javaagent:/deployment/app/lib/cryostat-agent.jar)。此设置可让工作负载应用程序的 JVM 在启动时加载并初始化 Cryostat 代理。Cryostat 代理的基本初始化完成后,您的工作负载应用程序的正常启动过程会照常启动。

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

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

  • 最简单的选项是将 JAR 文件添加到 pom.xmlbuild.gradle 文件中的应用依赖项中。您的构建工具(Maven 或 Gradle)下载 JAR 文件,以包含在应用构建输出中。
  • 您可以使用 Maven 插件(如 maven-dependency-plugin )提供对下载并包含应用程序构建输出中的 JAR 文件的更精细的控制。
  • 您可以创建一个包含 JAR 文件的 PersistentVolume 存储卷。然后,重新配置应用程序的 Deployment/DeploymentConfig 以挂载 PersistentVolume,并使用 -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 对象)发布其自身的 Cryostat 服务器后端的 URL 位置,如 https://my-cryostat.my-namespace.svc.cluster.local

cryostat.agent.callback

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

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

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 代理实例附加到哪个应用程序(默认为 cryostat-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 代理配置应用程序

您可以使用 Cryostat 代理(作为 Java Instrumentation Agent)来配置目标应用程序,以便 Cryostat 可以检测应用程序、收集数据,并将数据发送到 Cryostat 进行分析。您还可以选择启用 Cryostat 代理来接受来自 Cryostat 服务器的请求以启动、停止和删除 JFR 记录。

Red Hat build of Cryostat 2.4 分发 Cryostat 代理的 JAR 文件的两个不同变体。根据您的设置要求,您可以使用以下类型的代理 JAR 文件:

  • 一个自包含的 all-in-one "shaded" JAR 文件,其中包含代理代码及其所有依赖项

    这个 "shaded" JAR 文件提供了要在现有应用程序中包含的 Cryostat 代理的最方便形式,因为您只需要包含一个额外的代理 JAR 文件。这是类似代理和工具的通用分发模式。

  • 包含没有依赖项的代理代码的标准 JAR 文件

    如果您知道代理和工作负载应用程序之间存在依赖项冲突,则这种类型的 JAR 文件很有用。如果要应用自己的策略,以提供每个依赖项的正确版本以满足代理和应用程序的要求,您可以使用独立的 JAR 文件。

注意

在以前的版本中,这个版本提供了 Cryostat 代理的一个发行版本,它是一个一体化的 "shaded" 'JAR 文件。以下流程描述了如何安装 Cryostat 2.4 代理的"shaded" JAR 文件分发。

配置 Java 应用程序:Cryostat 代理 中所述,Cryostat 2.4 代理支持将代理的 JAR 文件包含到工作负载应用程序中的不同选项。以下流程描述了如何将 "shaded" JAR 文件添加到 pom.xmlbuild.gradle 文件中的应用程序依赖项中。

前提条件

  • 登录到您的 Cryostat web 控制台。
  • 已安装 JDK 版本 11 或更高版本。

流程

  1. 安装 Cryostat 代理。根据您的应用程序构建,选择以下选项之一:

    • 使用 Maven:

      使用 Cryostat 代理 JAR 文件信息更新应用 pom.xml 文件。

      pom.xml 示例

      <project>
        ...
        <repositories>
          <repository>
            <id>redhat-maven-repository</id>
            <url>https://maven.repository.redhat.com/earlyaccess/all/</url>
          </repository>
        </repositories>
        ...
        <build>
          <plugins>
            <plugin>
              <artifactId>maven-dependency-plugin</artifactId>
              <version>3.3.0</version>
              <executions>
                <execution>
                  <phase>prepare-package</phase>
                  <goals>
                    <goal>copy</goal>
                  </goals>
                  <configuration>
                    <artifactItems>
                      <artifactItem>
                        <groupId>io.cryostat</groupId>
                        <artifactId>cryostat-agent</artifactId>
                        <version>0.3.0.redhat-00001</version>
                        <classifier>shaded</classifier>
                      </artifactItem>
                    </artifactItems>
                    <stripVersion>true</stripVersion>
                  </configuration>
                </execution>
              </executions>
            </plugin>
          </plugins>
          ...
        </build>
        ...
      </project>

      下次构建应用程序时,Cryostat 代理 JAR 文件位于 target/dependency/cryostat-agent-shaded.jar

    • 使用 Gradle :

      更新 build.gradle 文件。

      build.gradle 文件示例

      repositories {
      	…
      maven {
          	url "https://maven.repository.redhat.com/earlyaccess/all/"
          	credentials {
            		username "myusername"
              	password "mytoken"
          	}
      	}
      }

      如何将代理 JAR 文件打包到应用中取决于您用于构建的 Gradle 插件。例如,如果您使用 Jib 插件,请按如下所示更新 build.gradle 文件:

      build.gradle 文件示例

      plugins {
      	id 'java'
      	id 'application'
      	id 'com.google.cloud.tools.jib' version '3.3.1'
      	id 'com.ryandens.javaagent-jib' version '0.5.0'
      }
      …
      dependencies {
      	…
      	javaagent 'io.cryostat:cryostat-agent:0.3.0.redhat-00001:shaded'

  2. 更新 Docker 文件。以下示例使用 JAVA_OPTS 环境变量传递相关的 JVM 信息。

    示例

    ...
    COPY target/dependency/cryostat-agent.jar /deployments/app/
    ...
    ENV JAVA_OPTS="-javaagent:/deployments/app/cryostat-agent-shaded.jar"

  3. 重建特定于应用程序的容器镜像。

    docker build -t docker.io/myorg/myapp:latest -f src/main/docker/Dockerfile
  4. 要提供需要配置 Cryostat 代理所需的 JVM 系统属性或环境变量,请推送更新的镜像,然后修改应用程序部署。

    示例

    apiVersion: apps/v1
    kind: Deployment
    ...
    spec:
      ...
      template:
        ...
        spec:
          containers:
            - name: sample-app
              image: docker.io/myorg/myapp:latest
              env:
                - name: CRYOSTAT_AGENT_APP_NAME
                  value: "myapp"
                  # Replace this with the Kubernetes DNS record
                  # for the Cryostat Service
                - name: CRYOSTAT_AGENT_BASEURI
                  value: "http://cryostat.mynamespace.mycluster.svc:8181"
                - name: POD_IP
                  valueFrom:
                    fieldRef:
                      fieldPath: status.podIP
                - name: CRYOSTAT_AGENT_CALLBACK
                  value: "http://$(POD_IP):9977" 1
                  # Replace "abcd1234" with a base64-encoded authentication token
                - name: CRYOSTAT_AGENT_AUTHORIZATION 2
                  value: "Bearer abcd1234"
                - name: CRYOSTAT_AGENT_API_WRITES_ENABLED 3
                  value: true
              ports:
                - containerPort: 9977
                  protocol: TCP
              resources: {}
          restartPolicy: Always
    status: {}

    • <1>:端口号 9977 是代理为服务 Cryostat 请求的内部 Web 服务器公开的默认 HTTP 端口。如果与安装代理的目标应用程序冲突,您可以更改此端口号。
    • <2>: CRYOSTAT_AGENT_AUTHORIZATION 值显示代理包含在 API 请求中的凭证,以公告其自身存在或推送 JFR 数据。您还可以为此目的创建 Kubernetes 服务帐户,并将 abcd1234 替换为与服务帐户关联的 base64 编码身份验证令牌。
    • <3> : CRYOSTAT_AGENT_API_WRITES_ENABLED 变量默认设置为 false。如果您希望 Cryostat 代理接受来自 Cryostat 服务器的请求以启动、停止或删除 JFR flight 记录,您必须将此变量设置为 true
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.