CloudWatch 解决方案:Amazon EC2 上的 Tomcat 工作负载
此解决方案可帮助您使用 CloudWatch 代理为在 EC2 实例上运行的 Tomcat 服务器配置开箱即用的指标收集。此外,它还可以帮助您设置预配置的 CloudWatch 控制面板。有关所有 CloudWatch 可观测性解决方案的一般信息,请参阅 CloudWatch 可观测性解决方案。
要求
此解决方案适用于以下情况:
支持的版本:Tomcat 版本 9、10.1 和 11(测试版)
计算:Amazon EC2
在给定的 Amazon Web Services 区域中跨所有 Tomcat 工作负载支持最多 500 个 EC2 实例
最新版本的 CloudWatch 代理
-
EC2 实例上已安装 SSM 代理
注意
Amazon Systems Manager(SSM Agent)预装在由 Amazon 和受信任的第三方提供的一些亚马逊机器映像(AMI)上。如果未安装代理,您可以根据操作系统类型使用程序手动安装。
优势
该解决方案提供 Tomcat 服务器监测,为以下用例提供宝贵的见解:
-
检测 Tomcat 服务器错误和性能问题。
-
监测网络流量的数据传输问题。
-
跟踪线程使用情况和活动用户会话。
-
分析 Tomcat 服务器的底层 JVM 性能。
以下是该解决方案的主要优点:
-
使用 CloudWatch 代理配置自动收集 Apache Tomcat 和底层 JVM 指标,无需手动检测。
-
为 Apache Tomcat 和 JVM 指标提供预配置的整合 CloudWatch 控制面板。控制面板将自动处理使用该解决方案配置的新 Tomcat EC2 实例的指标,即使这些指标在您首次创建控制面板时不存在。它还允许您将指标分组为逻辑应用程序,以便于关注和管理。
下图是此解决方案控制面板的示例。

成本
此解决方案在您的账户中创建和使用资源。您需要为标准使用量付费,包括以下各项:
CloudWatch 代理收集的所有指标按自定义指标收费。此解决方案使用的指标数量取决于 EC2 主机的数量。
-
为解决方案配置的每台 Tomcat 主机发布总共 27 个指标,外加一个指标(
disk_used_percent
),指标数量取决于该主机的磁盘路径数量。
-
一个自定义控制面板。
CloudWatch 代理请求用于发布指标的 API 操作。使用此解决方案的默认配置,CloudWatch 代理每分钟调用一次 PutMetricData。这意味着每台 EC2 主机将在 30 天(一个月)内调用 PutMetricData API
30*24*60=43,200
次。
有关 CloudWatch 定价的信息,请参阅 Amazon CloudWatch 定价
定价计算器可帮助您估算使用此解决方案的每月大致费用。
使用定价计算器估算每月解决方案成本
-
在指标部分中,对于指标数量,输入
(27 + average number of disk paths per EC2 host) * number of EC2 instances configured for this solution
。 -
在 API 部分中,对于 API 请求的数量,输入
43200 * number of EC2 instances configured for this solution
。默认情况下,该解决方案每分钟为每台 EC2 主机执行一次 PutMetricData 操作。
在控制面板和警报部分中,对控制面板数量输入
1
。-
您可以在定价计算器底部查看每月估算成本。
此解决方案的 CloudWatch 代理配置
CloudWatch 代理是在您的服务器和容器化环境中持续自主运行的软件。它从您的基础设施和应用程序收集指标、日志和跟踪,并将其发送到 CloudWatch 和 X-Ray。
有关 CloudWatch 代理的更多信息,请参阅使用 CloudWatch 代理收集指标、日志和跟踪信息。
此解决方案中的代理配置收集 Tomcat、JVM 和 EC2 的基础指标。可以将 CloudWatch 代理配置为收集比控制面板默认显示更多的 JVM 指标。有关您可以收集的所有 Tomcat 指标的列表,请参阅 收集 Tomcat 指标。有关您可以收集的所有 JVM 指标的列表,请参阅 收集 JVM 指标。有关 Amazon EC2 指标的列表,请参阅 Linux 和 macOS 实例上的 CloudWatch 代理收集的指标。
公开 Tomcat 服务器的 JMX 端口
CloudWatch 代理依靠 JMX 来收集与 Tomcat 服务器和 JVM 进程相关的指标。要做到这一点,必须公开服务器的 JMX 端口。要启用 JMX 端口进行监测和管理,您需要设置 Tomcat 服务器的系统属性。您可以使用环境变量 CATALINA_OPTS
设置 Tomcat 所需的系统属性。查看 Tomcat 服务器的启动脚本和配置文件,了解设置环境变量的最佳位置。请务必指定未使用的端口号。更改后,您需要重启服务器。
export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=<<port-number>> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
此示例设置未经身份验证的 JMX。如果您的安全策略/要求需要使用密码身份验证启用 JMX 或 SSL 进行远程访问,请参阅 JMX 文档
要验证 JMX 端口,请运行 ps aux | grep jmxremote.port
。结果应显示已在 JVM 进程上设置了 JMX 端口。
Tomcat 解决方案的代理配置
代理收集的指标在代理配置中定义。该解决方案提供代理配置,以收集建议的指标,并为解决方案的控制面板提供合适的维度。
稍后将在为您的解决方案部署代理中介绍部署解决方案的步骤。以下信息旨在帮助您了解如何针对环境自定义代理配置。
您必须针对自己的环境自定义以下代理配置的某些部分:
-
JMX 端口号是您在本文档上一节中配置的端口号。端口号位于配置的
endpoint
行中。 -
AppName
:此项用作收集的 Tomcat 应用程序指标的维度。提供一个有意义的名称,代表运行 Tomcat 应用程序的实例的分组。 -
ProcessGroupName
:此项用作为 Tomcat 主机收集的 JVM 指标的维度。提供与上面的AppName
相同的值。这是为了能够在解决方案控制面板下查看与服务器指标相同的 Tomcat 应用程序组的 JVM 指标。
例如,如果您在同一个 Amazon Web Services 账户中运行两个 Tomcat 应用程序,一个用于 billing-system
应用程序,另一个用于 order-system
应用程序,则可以在每个实例的代理配置中相应地设置 AppName
和 ProcessGroupName
维度。
-
对于
billing-system
应用程序实例,设置AppName=billing-system
和ProcessGroupName=billing-system
。 -
对于
order-system
应用程序实例,设置AppName=order-system
和ProcessGroupName=order-system
。
当您遵循这些准则时,解决方案将自动根据 AppName
和 ProcessGroupName
维度对指标进行分组。控制面板将包括下拉选项,用于选择和查看特定 Tomcat 应用程序的指标,从而允许您单独监测各应用程序的性能。
Tomcat 主机的代理配置
在部署 Tomcat 应用程序的 EC2 实例上使用以下 CloudWatch 代理配置。配置将作为参数存储在 SSM 的 Parameter Store 中,稍后将在步骤 2:在 Systems Manager Parameter Store 中存储建议的 CloudWatch 代理配置文件中详细介绍。
将 AppName
替换为一个有意义的名称,该名称代表实例所属的 Tomcat 应用程序。将 port-number
替换为 Tomcat 服务器的 JMX 端口。如果 JMX 启用了密码身份验证或 SSL 以进行远程访问,请参阅 收集 Java 管理扩展(JMX)指标,了解有关根据需要在代理配置中设置 TLS 或授权的信息。
此配置(在 JMX 区块之外显示的配置)中显示的 EC2 指标仅适用于 Linux 和 macOS 实例。如果您使用的是 Windows 实例,则可以选择在配置中省略这些指标。有关在 Windows 实例上收集的指标的信息,请参阅 Windows Server 实例上的 CloudWatch 代理收集的指标。
{ "metrics": { "namespace": "CWAgent", "append_dimensions": { "InstanceId": "${aws:InstanceId}" }, "metrics_collected": { "jmx": [ { "endpoint": "localhost:
port-number
", "tomcat": { "measurement": [ "tomcat.sessions", "tomcat.errors", "tomcat.processing_time", "tomcat.traffic", "tomcat.max_time", "tomcat.request_count", "tomcat.threads" ] }, "append_dimensions": { "AppName": "AppName
" } }, { "endpoint": "localhost:port-number
", "jvm": { "measurement": [ "jvm.classes.loaded", "jvm.gc.collections.count", "jvm.gc.collections.elapsed", "jvm.memory.heap.committed", "jvm.memory.heap.max", "jvm.memory.heap.used", "jvm.memory.nonheap.committed", "jvm.memory.nonheap.max", "jvm.memory.nonheap.used", "jvm.threads.count" ] }, "append_dimensions": { "ProcessGroupName": "AppName
" } } ], "disk": { "measurement": [ "used_percent" ] }, "mem": { "measurement": [ "used_percent" ] }, "swap": { "measurement": [ "used_percent" ] }, "netstat": { "measurement": [ "tcp_established", "tcp_time_wait" ] } } } }
为您的解决方案部署代理
安装 CloudWatch 代理有几种方法,具体视用例而定。对于此解决方案,我们建议使用 Systems Manager。它提供了控制台体验,使在单个 Amazon 账户中管理一组托管服务器变得更加简单。本节中的说明使用 Systems Manager,适用于没有使用现有配置运行 CloudWatch 代理的情况。您可以按照验证 CloudWatch 代理是否正在运行中的步骤检查 CloudWatch 代理是否正在运行。
如果您已经在部署 JVM 应用程序的 EC2 主机上运行 CloudWatch 代理并管理代理配置,则可以跳过本节中的说明并按照现有部署机制更新配置。请务必将 JVM 的代理配置与现有的代理配置合并,然后部署合并的配置。如果您使用 Systems Manager 存储和管理 CloudWatch 代理的配置,则可以将配置合并到现有参数值。有关更多信息,请参阅 Managing CloudWatch agent configuration files。
注意
使用 Systems Manager 部署以下 CloudWatch 代理配置,将替换或覆盖 EC2 实例上任何现有的 CloudWatch 代理配置。您可以修改此配置以适应您独有的环境或用例。此解决方案中定义的指标是建议控制面板所需的最低要求。
部署过程包括以下步骤:
步骤 1:确保目标 EC2 实例具有所需的 IAM 权限。
步骤 2:在 Systems Manager Parameter Store 中存储建议的代理配置文件。
步骤 3:使用 Amazon CloudFormation 堆栈在一个或多个 EC2 实例上安装 CloudWatch 代理。
步骤 4:验证代理设置是否正确配置。
步骤 1:确保目标 EC2 实例具有所需的 IAM 权限
您必须授予 Systems Manager 安装和配置 CloudWatch 代理的权限。您还必须授予 CloudWatch 代理将遥测数据从 EC2 实例发布到 CloudWatch 的权限。确保附加到实例的 IAM 角色已附加 CloudWatchAgentServerPolicy 和 AmazonSSMManagedInstanceCore IAM 策略。
-
创建角色后,将该角色附加到 EC2 实例。在启动新的 EC2 实例时,按照启动带有 IAM 角色的实例中的步骤进行操作以附加角色。要将角色附加到现有 EC2 实例,请按照将 IAM 角色附加到实例中的步骤进行操作。
步骤 2:在 Systems Manager Parameter Store 中存储建议的 CloudWatch 代理配置文件
Parameter Store 通过安全地存储和管理配置参数,简化了 CloudWatch 代理在 EC2 实例上的安装,而无需硬编码值。这可确保更加安全灵活的部署过程,从而实现集中管理,并且可以更轻松地跨多个实例更新配置。
使用以下步骤将建议的 CloudWatch 代理配置文件作为参数存储在 Parameter Store 中。
创建 CloudWatch 代理配置文件作为参数
访问 https://console.aws.amazon.com/systems-manager/
,打开 Amazon Systems Manager 控制台。 从导航窗格中,依次选择应用程序管理、Parameter Store。
-
按照以下步骤为配置创建新参数。
-
选择创建参数。
-
在名称框中,输入您将在后续步骤中用来引用 CloudWatch 代理配置文件的名称。例如
AmazonCloudWatch-Tomcat-Configuration
。 -
(可选)在描述框中,键入参数的描述。
-
对于参数层,选择标准。
-
对于类型,选择字符串。
对于数据类型,选择文本。
-
在值框中,粘贴 Tomcat 主机的代理配置中列出的相应 JSON 块。请务必按照所述自定义分组维度值和端口号。
-
选择创建参数。
-
步骤 3:安装 CloudWatch 代理并使用 Amazon CloudFormation 模板应用配置
您可以使用 Amazon CloudFormation 安装代理,并将其配置为使用您在前面步骤中创建的 CloudWatch 代理配置。
为此解决方案安装和配置 CloudWatch 代理
-
使用以下链接打开 Amazon CloudFormation 快速创建堆栈向导:https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json
。 -
确认控制台上的所选区域是运行 Tomcat 工作负载的区域。
-
对于堆栈名称,输入用于识别此堆栈的名称,如
CWAgentInstallationStack
。 -
在参数部分中,指定以下各项:
-
对于 CloudWatchAgentConfigSSM,请输入您之前创建的代理配置的 Systems Manager 参数名称,例如
AmazonCloudWatch-Tomcat-Configuration
。 -
要选择目标实例,您有两种选择。
-
对于 InstanceIds,请指定一个以逗号分隔的实例 ID 列表,其中包含希望使用此配置安装 CloudWatch 代理的实例 ID。您可以列出一个或多个实例。
-
如果要大规模部署,则可以指定 TagKey 和相应的 TagValue,以将具有此标签和值的所有 EC2 实例作为目标。如果指定 TagKey,则必须指定相应的 TagValue。(对于自动扩缩组,为 TagKey 指定
aws:autoscaling:groupName
并为 TagValue 指定自动扩缩组名称,以部署到自动扩缩组内的所有实例。)如果同时指定了 InstanceIds 和 TagKeys 参数,将优先采用 InstanceIds,而标签将被忽略。
-
-
-
检查设置,然后选择创建堆栈。
如果要先编辑模板文件进行自定义,请选择创建堆栈向导下的上传模板文件选项,上传编辑后的模板。有关更多信息,请参阅在 Amazon CloudFormation 控制台上创建堆栈。您可以使用以下链接下载模板:https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json
注意
完成此步骤后,此 Systems Manager 参数将与目标实例中运行的 CloudWatch 代理相关联。这意味着:
-
如果删除 Systems Manager 参数,代理将停止。
-
如果编辑了 Systems Manager 参数,则配置更改将按计划频率(默认为 30 天)自动应用到代理。
-
如果要立即应用对此 Systems Manager 参数的更改,则必须再次运行此步骤。有关关联的更多信息,请参阅在 Systems Manager 中使用关联。
步骤 4:验证代理设置是否正确配置
您可以按照验证 CloudWatch 代理是否正在运行中的步骤验证 CloudWatch 代理是否已安装。如果 CloudWatch 代理尚未安装和运行,请确保已正确设置所有内容。
-
请确保您已为 EC2 实例附加具有正确权限的角色,如步骤 1:确保目标 EC2 实例具有所需的 IAM 权限中所述。
如果一切设置正确,那么您应该会看到 Tomcat 指标发布到 CloudWatch。您可以查看 CloudWatch 控制台以验证这些指标是否已发布。
验证 Tomcat 指标是否已发布到 CloudWatch
通过 https://console.aws.amazon.com/cloudwatch/
打开 CloudWatch 控制台。 选择指标、所有指标。
确保您已选择部署解决方案的区域,然后选择自定义命名空间、CWAgent。
搜索本文档代理配置部分中提及的指标,例如
tomcat.errors
。如果您看到这些指标的结果,则表明这些指标已发布到 CloudWatch。
创建 Tomcat 解决方案控制面板
此控制面板显示新发出的指标,同时显示 Tomcat 应用服务器和底层 JVM。此控制面板提供了 Tomcat 工作负载运行状况的排名靠前的贡献者视图。排名靠前的贡献者视图显示每个指标的前 10 名小部件。这样就能一眼识别出异常值。该控制面板还通过聚合和显示所有实例的指标来提供集群概览,从而提供集群总体运行状况和运行状态的高级摘要。
解决方案控制面板不显示 EC2 指标。要查看 EC2 指标,您需要使用 EC2 自动控制面板查看 EC2 公开发布的指标,并使用 EC2 控制台控制面板查看 CloudWatch 代理收集的 EC2 指标。有关 Amazon Web Services 服务自动控制面板的更多信息,请参阅查看单项 Amazon 服务的 CloudWatch 控制面板。
要创建控制面板的操作,可以使用以下选项:
使用 CloudWatch 控制台创建控制面板。
使用 Amazon CloudFormation 控制台部署控制面板。
以 Amazon CloudFormation 基础设施即代码,并将其作为持续集成(CI)自动化的一部分进行集成。
通过使用 CloudWatch 控制台创建控制面板,您可以在实际创建和收费之前预览控制面板。
注意
此解决方案中使用 Amazon CloudFormation 创建的控制面板显示解决方案部署区域的指标。请务必在发布 Tomcat 指标的区域创建 Amazon CloudFormation 堆栈。
如果您在 CloudWatch 代理配置中指定了 CWAgent
以外的自定义命名空间,则必须更改控制面板的 Amazon CloudFormation 模板,将 CWAgent
替换为您使用的自定义命名空间。
使用 CloudWatch 控制台创建控制面板
注意
解决方案控制面板目前仅显示 G1 Garbage Collector 的垃圾回收相关指标,G1 Garbage Collector 是最新 Java 版本的默认收集器。如果您使用的是不同的垃圾回收算法,则与垃圾回收相关的小部件为空。但是,您可以通过更改控制面板 CloudFormation 模板,并将相应的垃圾回收类型应用于垃圾回收相关指标的名称维度来自定义这些小部件。例如,如果您使用的是并行垃圾回收,请将垃圾回收计数指标 jvm.gc.collections.count
从 name=\"G1 Young Generation\"
更改为 name=\"Parallel GC\"
。
-
使用以下链接打开 CloudWatch 控制台创建控制面板:https://console.aws.amazon.com/cloudwatch/home?#dashboards?dashboardTemplate=ApacheTomcatOnEc2&referrer=os-catalog
。 -
确认控制台上的所选区域是运行 Tomcat 工作负载的区域。
-
输入控制面板的名称,然后选择创建控制面板。
为了便于将此控制面板与其他区域的类似控制面板区分开来,我们建议在控制面板名称中包含区域名称,例如
TomcatDashboard-us-east-1
。 -
预览控制面板并选择保存以创建控制面板。
通过 Amazon CloudFormation 创建控制面板
-
使用以下链接打开 Amazon CloudFormation 快速创建堆栈向导:https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Tomcat_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json
。 -
确认控制台上的所选区域是运行 Tomcat 工作负载的区域。
-
对于堆栈名称,输入用于识别此堆栈的名称,如
TomcatDashboard-us-east-1
。 -
在参数部分,在 DashboardName 参数下指定控制面板的名称。
-
为了便于将此控制面板与其他区域的类似控制面板区分开来,我们建议在控制面板名称中包含区域名称,例如
TomcatDashboard-us-east-1
。 -
在功能和转换下确认转换的访问功能。请注意,CloudFormation 不会添加任何 IAM 资源。
-
检查设置,然后选择创建堆栈。
-
堆栈状态为 CREATE_COM PLETE 后,选择创建的堆栈下的资源选项卡,然后选择物理 ID 下的链接转至控制面板。您也可以通过在控制台左侧导航窗格中选择控制面板,然后在自定义控制面板下找到控制面板名称,在 CloudWatch 控制台中访问控制面板。
如果要编辑模板文件以出于任何目的对其进行自定义,则可以使用创建堆栈向导下的上传模板文件选项来上传编辑后的模板。有关更多信息,请参阅在 Amazon CloudFormation 控制台上创建堆栈。您可以使用以下链接下载模板:https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Tomcat_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json
注意
解决方案控制面板目前仅显示 G1 Garbage Collector 的垃圾回收相关指标,G1 Garbage Collector 是最新 Java 版本的默认收集器。如果您使用的是不同的垃圾回收算法,则与垃圾回收相关的小部件为空。但是,您可以通过更改控制面板 CloudFormation 模板,并将相应的垃圾回收类型应用于垃圾回收相关指标的名称维度来自定义这些小部件。例如,如果您使用的是并行垃圾回收,请将垃圾回收计数指标 jvm.gc.collections.count
从 name=\"G1 Young Generation\"
更改为 name=\"Parallel GC\"
。
开始使用 Tomcat 监测控制面板
您可以使用新的 Tomcat 控制面板尝试以下几项任务。这些任务允许您验证控制面板是否正常运行,并为您提供使用它来监测 Tomcat 应用程序的一些实践经验。在尝试这些任务的过程中,您将熟悉如何浏览控制面板和解读可视化指标。
使用下拉列表
控制面板顶部提供了下拉列表,可以用来筛选和选择要监测的特定 Tomcat 应用程序。要显示特定 Tomcat 应用程序的指标,请在 Tomcat 应用程序下拉列表中选择该应用程序的名称。
验证应用程序运行状况
从应用程序概览部分,找到请求、错误和错误率小部件。这些小部件提供应用程序请求处理性能的高级概要。查找任何异常高的错误计数或错误率,这可能表明存在需要调查的问题。
监测请求处理情况
在请求处理时间部分,找到最长时间和处理所有请求的总时间小部件。这些指标可帮助您确定请求处理中潜在的性能瓶颈。查找与其他服务器相比,其最长处理时间要长得多的服务器。
分析网络流量
在网络流量部分,找到已发送流量和已接收流量小部件。这些小部件显示应用程序通过网络发送和接收的数据量。意外的高流量水平可能表明网络饱和或数据传输效率低下等潜在问题。
调查线程使用情况
在会话和线程部分,找到繁忙线程数、线程数和会话数小部件。这些指标可以深入了解应用程序的线程管理和活跃的用户会话。查找任何繁忙线程或会话数量异常多的服务器,这可能表明存在潜在的资源限制。