作为介绍...
工业开发需要有关应用程序如何生存的知识。该论文应被视为公理。这些知识就是应用程序产生的指标。指标可以纯粹是技术指标(例如,消耗的RAM数量),也可以是业务指标(例如,完成的订单)。
就其本身而言,削减指标目前并不总是很有趣并且具有指示性。有关收集,存储和显示这些指标的基本问题出现了。
当使用一种服务方法,并且从用户的角度来看,一个应用程序受到多个交互服务的操作的支持时,需要度量及其处理方式的情况变得更加严峻。在其中添加云部署并获得辣椒。
有什么事
我参与的项目只是使用服务,并已部署到AWS(Amazon Web Services)。大多数服务是使用Java 8 +,Spring Boot和Docker构建的。在Luxoft IT Sreda#7上的演讲和本文源于该项目的需求和目标。
我的目标是研究使用Spring Boot收集应用程序指标并将其导出到AWS CloudWatch的实际方面。实际上,这将是一个逐步的指南,其中包括解释,细微差别分析和可能的结果。
当我们谈论解决实际问题时,重要的是要了解其症状,以便将其与现有环境进行比较。是否可以一对一地应用我们正在谈论的内容,或者如果需要适应,则需要更多的研究。
让我们看一下我们当前的上下文是什么:
- 毫无疑问,我们的应用程序或服务基于Spring Boot。作为Maven构建器,Java 8+
- 码头工人 但是,其使用并不重要。对于在docker中运行的应用程序,一切也将正常工作很重要
- AWS EC2是运行应用程序的基础架构。它的核心是AWS中的虚拟机。
- 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上找到。