在AWS CloudWatch中收集SpringBoot应用程序指标

你好!我的名字叫Artem Areshko,我是Luxoft的金融科技项目的首席Java开发人员。今天,我们将讨论指标,Spring Boot和Amazon云。



作为介绍...



工业开发需要有关应用程序如何生存的知识。该论文应被视为公理。这些知识就是应用程序产生的指标。指标可以纯粹是技术指标(例如,消耗的RAM数量),也可以是业务指标(例如,完成的订单)。



就其本身而言,削减指标目前并不总是很有趣并且具有指示性。有关收集,存储和显示这些指标的基本问题出现了。



当使用一种服务方法,并且从用户的角度来看,一个应用程序受到多个交互服务的操作的支持时,需要度量及其处理方式的情况变得更加严峻。在其中添加云部署并获得辣椒



有什么事



我参与的项目只是使用服务,并已部署到AWS(Amazon Web Services)。大多数服务是使用Java 8 +,Spring Boot和Docker构建的。Luxoft IT Sreda#7上的演讲和本文源于该项目的需求和目标。



我的目标是研究使用Spring Boot收集应用程序指标并将其导出到AWS CloudWatch的实际方面实际上,这将是一个逐步的指南,其中包括解释,细微差别分析和可能的结果。



当我们谈论解决实际问题时,重要的是要了解其症状,以便将其与现有环境进行比较。是否可以一对一地应用我们正在谈论的内容,或者如果需要适应,则需要更多的研究。



让我们看一下我们当前的上下文是什么:



  1. 毫无疑问,我们的应用程序或服务基于Spring Boot。作为Maven构建器,Java 8+
  2. 码头工人 但是,其使用并不重要。对于在docker中运行的应用程序,一切也将正常工作很重要
  3. AWS EC2是运行应用程序的基础架构。它的核心是AWS中的虚拟机。
  4. AWS CloudWatch是一个监视系统,是一个AWS基础结构仪表板。


春季靴



让我们继续SpringBoot及其可以帮助我们的功能。兵工厂中最重要的第一件事是执行器该模块允许您查看正在运行的应用程序,并在一定程度上自定义其行为。例如:



  • Health check:
  • , , runtime.
  • ,
  • , , : , , GC.
  • ...


像许多Spring组件一样,Actuator与构造函数类似,可以自定义,扩展和微调。您可以从这里开始学习



在整个集合中,我们目前对指标感兴趣。尤其是执行器和度量标准不仅可以扩展,而且可以预先配置,因此,现成的度量标准类别只有几十种。当然,您可以注册自己的指标。如果Web模块已连接到项目中,则可以通过联系获取指标endpoint /metrics



度量标准的收集和传递是通过千分尺库实现的,该库Pivotal的产品(现在是VMware的一部分),与开发Spring相同。千分尺作为一种独立于供应商的外观销售,用于导出Java应用程序度量标准。



执行器将需要连接以下启动器:



<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


春云



接下来,我们需要Spring Cloud中的一个模块,即spring-cloud-starter-aws



Spring Cloud系列中的每个模块都有其自己的版本控制,不使用特定版本的模块,而是使用特定版本的BOM spring-cloud-dependencies(发行版)来收集模块的兼容版本是正确的。在撰写本文时,这是Hoxton.RELEASE。



除了可spring-cloud-starter-aws传递的依赖关系之外,它还提供了与AWS配合使用的美味自动配置,它提供了aws-java-sdk



在DependencyManagement部分中,



<dependencyManagement>
...
   <dependencies>
       <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-dependencies</artifactId>
          <version>Hoxton.RELEASE</version>
          <type>pom</type>
          <scope>import</scope>
       </dependency>
   </dependencies>
...
</dependencyManagement>


并取决于:



<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-aws</artifactId>
</dependency>


千分尺注册表



我们现在在弹簧执行器和弹簧中有一个千分尺aws-java-sdk千分尺开箱即用,不知道如何将数据导出到AWS CloudWatch,这需要适当地实现MeterRegestry,MeterRegestry是用于收集指标的千分尺抽象。默认值为SimpleMeterRegistry,它将数据存储在内存中。所需的实现与一起连接micrometer-registry-cloudwatch在撰写本文时,当前版本为1.3.5。



<dependency>
   <groupId>io.micrometer</groupId>
   <artifactId>micrometer-registry-cloudwatch</artifactId>
   <version>1.3.5</version>
</dependency>


在我们的例子中,最终的pom.xml看起来像这样:github.com/MrArtemAA/blog-demos/blob/master/export-metrics-to-cloudwatch/pom.xml



app.properties



让我们继续设置应用程序属性,在我们的案例中它起着重要作用:



1 management.metrics.export.cloudwatch.namespace.。:您需要指定将名称保存在CloudWatch中的命名空间。因为在指标本身中,没有信息表明数据来自哪个应用程序实例,名称空间将仅确定特定实例的指标。否则,如果您为多个实例定义一个名称空间,则指标数据将混合在一起,并且不清楚它们来自何处。



图片



2 management.metrics.export.cloudwatch.batch-size。:需要将batch-size属性的值显式设置为20。此参数是什么,为什么精确为20?指标一次异步发送到Amazon CloudWatch客户端,每批20个(这是AWS限制)。



3 。:cloud.aws.stack.auto=false需要禁用AWS CloudFormation堆栈自动检测以来 默认为= true。此属性负责应用程序是否将尝试自动获取堆栈名称以针对云环境(在“基础结构即代码”范例中)配置应用程序。与常规虚拟机一样,在EC2上进行部署时,此信息不可用。



重要的是要了解,AWS开发工具包将尝试在不进行额外配置的情况下自行获取所有信息,这些信息(库)将从EC2元数据中获取为了获得此信息,有一个特殊的服务端点,在此进行呼叫。



汇报



批量



让我们回到该属性management.metrics.export.cloudwatch.batch-size以及将其设置为等于20的需要。似乎所有这些工作都可以在与AWS一起使用的相应库的级别上完成。确实,micrometer-registry-cloudwatch有一个接口带有一种CloudWatchConfig default方法,方法可以正确地检查该值并在该值超过20时引发异常。但是,如果您看一下org.springframework.cloud.aws.autoconfigure.metrics.CloudWatchExportAutoConfiguration,我们将看到使用org.springframework.cloud.aws.autoconfigure.metrics.CloudWatchPropertiesConfigAdapter:



@Bean
@ConditionalOnMissingBean
public CloudWatchConfig cloudWatchConfig(CloudWatchProperties cloudWatchProperties) {
  return new CloudWatchPropertiesConfigAdapter(cloudWatchProperties);
}


适配器依次覆盖batchSize()



@Override
public int batchSize() {
  return get(CloudWatchProperties::getBatchSize, CloudWatchConfig.super::batchSize);
}


这意味着,如果CloudWatchProperties定义属性,则将从那里获取它。它不包含必要的检查,并且如果未显式设置该属性,则默认值为10000。



对AWS的请求



应用程序(服务)不能仅向Amazon服务发出请求。他们[请求]必须包含凭证。为此,AWS开发工具包具有一个凭据提供程序链,推荐使用。这些提供程序中包括实例配置文件,它可以基于EC2元数据接收数据。为此,您需要确保角色绑定到EC2







该角色必须授予向CloudWatch发出请求的权限,并且该权限可用于EC2。可以在创建新的EC2实例时指定角色,也可以将角色附加到现有的角色上。该角色是即时应用的。



禁用指标



对于本地构建或测试环境,导出指标可能会过大。设置该属性management.metrics.export.cloudwatch.enabled=false可让您禁用将指标导出到CloudWatch,同时将执行指标收集,并且如果连接了Web模块,则endpoint /metrics它们仍然可用。



千分尺收集并提供各种指标。如果不需要其中一些,则可以禁用它们。您可以单独或按整个类别禁用。因此,例如,该属性将禁用所有ID以开头的指标请注意:完全不会收集禁用的指标。management.metrics.enable.some.metric=falsesome.metric



运行所有AWS



如果您尝试使用最低要求的设置运行所有AWS的应用程序,则还会有另一个惊喜。为了进行操作,运行应用程序的区域的必要数据。众所周知,无论有没有明确说明的内容,AWS开发工具包都将尝试从元数据中获取……而这并不存在。因此,我们通过属性明确指出所需区域cloud.aws.region.static=us-east-2。与使用堆栈名称(property cloud.aws.stack.auto)的情况一样,默认情况下有一个cloud.aws.region.auto等于属性true。但是,仅将值设置为false不会对我们有帮助,因为需要该区域的值。



另外,我们记得,对AWS的请求需要凭证,因此,如果您需要将指标发送到CloudWatch(或向AWS发出其他请求),则必须显式指定凭证参数。通过例如应用程序属性或环境变量。



传递应用程序属性如下所示:

cloud.aws.credentials.access-key=YOUR_ACCESS_KEY

cloud.aws.credentials.secret-key=YOUR_SECRET_KEY




结果



正如我认为您可能已经注意到的那样,让整个方案正常运行并将指标从应用程序转移到CloudWatch并不困难:它需要3个依赖项3个属性



最重要的是细节。诸如Spring,AWS开发工具包之类的库(框架)试图使生活更轻松,并尽一切可能为我们完成所有工作,但与此同时,任何一步都可能导致堆栈跟踪的出现,试图理解为什么指标不行,为什么应用程序根本无法启动以及如何解决。我希望这一节包含细微差别,并描述EC2和CloudWatch服务如何工作的一些细节,希望可以帮助您了解正在发生的事情。



如果我们谈论使用CloudWatch本身,那么,我认为,使用AWS基础设施时,这是很自然的选择。



指标是我们应用程序的眼睛和耳朵,但这并不否认您需要了解如何收集,计数和显示指标的事实。您将在图表上看到什么样的数据。在异常情况和事件分析中,此问题尤其严重如果我们谈论千分尺库,则值得参考文档,例如,其中有关于千分尺类型(米)的详细说明。



链接



经验的交流使我们能够快速掌握各种方法,工具,技术并向前迈进。因此,我不能忽略该主题上最有用的材料,这些材料在文章中没有被引用:



Spring Boot:使用测微表和AWS CloudWatch

Spring Cloud进行度量使用Amazon Web Services。Spring Boot自动配置

春季行动5,Craig Walls,Manning

广受Amazon Web Services的欢迎



完成的项目可以在GitHub找到



作者:Artem Areshko,首席Java开发人员




All Articles