Spring Boot学习(六)

来源:互联网 发布:python 3.6 编辑:程序博客网 时间:2024/06/05 01:21

提供度量指标

微服务最重要的一个特性可能就是为报表终端(reporting agent)提供度量指标。不像那些功能完备的Web应用,微服务是轻量级的,设计时可能就不会规划提供报表界面或完备的接口来分析服务的活动。这种类型的操作最好是留给专门进行数据聚合和分析的应用,这些数据能够用来进行稳定性、性能以及商务智能的监控。基于这样的前提,微服务应该为这些工具提供端点,从而更加容易地获取有关该服务活动的数据。而报表工具负责将数据聚合到一个视图或报告中,对于关心数据的人这才是有意义的。

微服务的一些指标如稳定性和性能,对所有的应用都是通用的,但是与业务操作相关的指标必须由应用本身来具体进行管理。针对这一点,Spring Boot的actuator模块为开发人员提供了一种机制,允许开发人员通过/metrics端点以编码的方式暴露微服务状态的细节。Boot将指标拆分为“counter”和“gauge”两种类别:counter是所有以Number类型来展现的指标,而gauge是衡量双精度计算的指标。为了让微服务的开发人员更加容易地使用指标,Boot暴露了CounterService和GaugeService,它们可以自动织入到应用上下文之中。请参见程序清单1.25的样例,它阐述了如何通过CounterService对外暴露点击数。

程序清单1.25

@RestController@RequestMapping("/user")@EnableAutoConfigurationclass UserController {   @Autowired  UserRepositoryrepository   @Autowired  CounterServicecounterService  @RequestMapping(method = [GET])  def get() {    get(null)  }  @RequestMapping(value="/{id}", method = [GET])  defget(@PathVariable Long id) {   counterService.increment id ? "queries.by.id.$id" :"queries.without.id"    id ?repository.findOne(id) : repository.findAll()  }}

在点击/user端点时,有可能提供ID也有可能不提供ID,/metrics端点都会在counter.父节点下记录新的key。例如,如果我们只是查询/user端点而不带有ID的话,那么就会注册counter.queries.without.id指标。类似的,如果我们带有ID的话,那么就会看到有一个counter.queries.by.id.<id>的key,它能用来标记对于给定的ID已经进行了多少次查询。这些指标可能会有助于掌握最经常访问的User对象并指导要采取的行为,如缓存或数据库索引。类似于递增指标的数值,CounterService也允许将指标的值将为零。这对于跟踪打开的连接数或其他频率分布(histographic)的测量都是很有用处的。

gauge是稍微有所不同的一种类型指标,它会进行探索性的计算或基于请求来确定值。如GaugeService的JavaDocs所述,“gauge”可以测量任意的值,从方法执行的次数到会议室的温度。当需要为报表工具暴露细节时,这种类型的测量尤其适合于使用GaugeService。gauge的指标会在/metrics端点之下进行访问,并且带有gauge.前缀。它们的注册方式与counter有些差别,如程序清单1.26所示。

程序清单1.26

@RestController@RequestMapping("/user")@EnableAutoConfigurationclass UserController {   @Autowired  UserRepositoryrepository   @Autowired  CounterServicecounterService  @RequestMapping(method = [GET])  def get() {    get(null)  }  @RequestMapping(value="/{id}", method = [GET])  defget(@PathVariable Long id) {    def start = newDate().time    def result = id? repository.findOne(id) : repository.findAll()    def time = newDate().time - start   gaugeService.submit("user.get.db.time", time.doubleValue())    result  }}

默认情况下,指标会存储在一个易失的内存数据库之中,但Boot同时也为应用上下文提供了MetricsRepository实现,它能支持更为持久化的行为。Boot自带了一个RedisMetricsRepository,它能够自动织入进来,从而将指标存储到Redis值存储之中,另外,可以编写自定义的实现将指标存储到任意的数据存储形式之中。

Boot还提供了对Coda Hale Metrics的支持,它会将以特定名称开头的指标强制转换为对应的Metrics类型。例如,如果有一个指标是以histogram.开头,那么这个值将会作为Histogram对象类型。这种自动化的强制转换对于meter.和timer.key也是有效的,而普通的指标将会作为Gauge类型。

一旦微服务的指标在Boot中进行了注册,那么报表工具就可以通过/metrics端点来检索它们。已命名的指标可以通过/metrics端点获取,只需将指标的key名作为查询字符串的一部分即可。例如,如果只是访问gauge指标下的“user.get.db.time”,报表工具可以针对/metrics/gauge.user.get.db.time进行查询。
原创粉丝点击