34. Metrics Emitter

Spring Cloud Stream 提供了一个名为spring-cloud-stream-metrics的模块,可用于从Spring Boot metrics 端点发出任何可用的度量标准到命名的 channel。此模块允许 operators 从 stream applications 收集 metrics,而不依赖于轮询其 endpoints。

为 metrics binding,e.g 设置目标 name 时,将激活该模块。 spring.cloud.stream.bindings.applicationMetrics.destination=<DESTINATION_NAME>applicationMetrics可以以与任何其他 producer binding 类似的方式配置。 applicationMetrics的默认contentType设置为application/json

以下 properties 可用于自定义 metrics 的发射:

  • spring.cloud.stream.metrics.key

    • 要发出的度量标准的 name。应该是每个 application 的唯一 value。
  • 默认

    • ${spring.application.name:${vcap.application.name:${spring.config.name:application}}}
  • spring.cloud.stream.metrics.prefix

    • 前缀 string 将添加到 metrics key 之前。

默认值:``

  • spring.cloud.stream.metrics.properties

    • 就像includes选项一样,它允许将白名单 application properties 添加到 metrics 有效负载中

默认值:null。

可以在Spring Boot reference 文档中找到 metrics export process 的详细概述。 Spring Cloud Stream 提供了一个名为application的度量导出器,可以通过常规Spring Boot metrics configuration properties进行配置。

可以使用导出程序的 global Spring Boot configuration 设置或使用 exporter-specific properties 来配置导出程序。要使用 global configuration 设置,properties 应以spring.metric.export(e.g. spring.metric.export.includes=integration**)作为前缀。这些 configuration 选项将应用于所有导出器(除非它们的配置不同)。或者,如果打算使用与其他导出程序不同的 configuration 设置(e.g. 用于限制已发布的 metrics 的数量),则可以使用前缀spring.metrics.export.triggers.application(e.g .spring.metrics.export.triggers.application.includes=integration**)配置 Spring Cloud Stream 提供的 metrics 导出程序。

由于 Spring Boot 的轻松 binding,包含 property 的 value 可能与原始 value 略有不同。

根据经验,度量标准导出器将尝试使用点表示法(e.g. JAVA_HOME变为java.home)以一致格式标准化所有 properties。

规范化的目标是使那些 metrics 的下游消费者能够始终如一地接收 property 名称,无论他们如何在受监视的 application 上设置它们(--spring.application.nameSPRING_APPLICATION_NAME总是 yield spring.application.name)。

下面是通过以下命令以 JSON 格式发布到 channel 的数据的示例:

java -jar time-source.jar \
    --spring.cloud.stream.bindings.applicationMetrics.destination=someMetrics \
    --spring.cloud.stream.metrics.properties=spring.application** \
    --spring.metrics.export.includes=integration.channel.input**,integration.channel.output**

生成的 JSON 是:

{
   "name":"time-source",
   "metrics":[
      {
         "name":"integration.channel.output.errorRate.mean",
         "value":0.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.errorRate.max",
         "value":0.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.errorRate.min",
         "value":0.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.errorRate.stdev",
         "value":0.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.errorRate.count",
         "value":0.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.sendCount",
         "value":6.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.sendRate.mean",
         "value":0.994885872292989,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.sendRate.max",
         "value":1.006247080013156,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.sendRate.min",
         "value":1.0012035220116378,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.sendRate.stdev",
         "value":6.505181111084848E-4,
         "timestamp":"2017-04-11T16:56:35.790Z"
      },
      {
         "name":"integration.channel.output.sendRate.count",
         "value":6.0,
         "timestamp":"2017-04-11T16:56:35.790Z"
      }
   ],
   "createdTime":"2017-04-11T20:56:35.790Z",
   "properties":{
      "spring.application.name":"time-source",
      "spring.application.index":"0"
   }
}