一、MicroProfile 1.1中的监控指标规范


在生产中部署的任何应用程序,都需要一个监控方案来跟踪有关应用程序性能和使用情况的指标。当出现缺陷或应用程序性能出现问题的时候,监视应用程序性能细节的价值不容小觑。标准化应用程序如何公开指标数据以及指标数据的内容和格式非常重要,以实现最有效和最简单的监控解决方案。


运行状况检查的主要功能是:快速指示应用程序的运行状况。如果运行状况检查失败,编排应用程序部署的平台(如OpenShift)会使用运行状况信息重新启动应用程序。另一方面,度量标准通过查明底层软件问题,为容量规划提供长期趋势数据,以及主动发现与平台相关的问题(例如磁盘使用量不受限制地增长)来确定应用程序的运行状况。您还可以使用指标配置OpenShift,以根据应用程序使用情况决定何时扩展应用程序以在更多或更少的pod上运行。


Java提供Java Management Extensions(JMX)作为公开Java虚拟机的低级度量标准的标准。但是,remote-JMX不适合在多语言环境中,其他服务可能无法在JVM上运行。 MicroProfile指标规范的主要目标是提供一个标准,概述如何公开一组标准指标数据以及基于MicroProfile的应用程序的任何自定义指标数据。标准化度量标准数据及其公开方式使您可以对所有微服务使用通用监视策略。所有MicroProfile实现都必须遵循度量规范中定义的标准,以获取可用的度量标准,HTTP返回码,API路径以及服务器用于表示度量标准数据的JSON数据类型。


当使用MicroFrofile指标实施(例如WildFly Swarm)时,指标数据通过HTTP上的REST通过HTTP公开,以两种不同的数据格式用于HTTP GET请求:


  • JSON格式:HTTP Accept标头与application / json匹配时的响应格式

  • Prometheus文本格式:HTTP Accept标头与更具体的媒体类型不匹配时的默认响应格式,例如application / json




MicroProfile指标规范将指标划分为三个主要类别。 在规范中,这些类别称为范围,用于组织可用的度量标准。 规范中定义的三个可用范围是:


Base metrics 基本指标

基本指标是规范中概述的最低要求指标。 这些基本指标包括JVM统计信息,例如当前堆大小,垃圾收集时间,线程计数以及其他操作系统和主机系统信息。 实施MicroProfile的所有供应商都必须包含这些指标。 这些度量标准使用相对路径/metrics/base自动公开为REST端点。


Vendor metrics供应商指标

供应商指标包括MicroProfile实施可以选择包含的基本必需指标集之上的任何指标数据使用相对路径/ metrics/vendor将供应商特定度量标准公开为REST端点。供应商特定数据的示例是任何特定于平台的度量标准,例如OSGi统计信息(如果启用MicroProfile的容器内部运行在OSGi之上)。


Application metrics 应用指标

应用程序指标是应用程序开发人员定义的自定义指标,并且特定于该特定应用程序。应用程序度量的一个示例是调用特定方法的次数,或者过去十五分钟内活动用户的当前计数。实现不能自动包含特定于应用程序的度量标准,因为它们是在运行时由应用程序提供的。为了解决这个问题,该规范定义了一个Java API,它使用注释来定义自定义应用程序指标。使用相对路径/metrics/application,MicroProfile实现将这些度量标准自动公开为REST端点。



为了提供度量数据的最大价值,规范还定义了一组公共元数据,规范的任何实现必须提供这些元数据才能为数据提供上下文。规范为所有度量数据定义的属性包括以下字段:


单元unit

一组固定的字符串单元。


类型type

定义度量标准类型。有一组固定的类型可用。这些包括:

  • 计数器:递增或递减的数值。例如,计数器可能会跟踪收到的请求总数或并发活动的HTTP会话总数。

  • gauge:必须采样以获取其值的度量。例如,CPU温度或磁盘使用情况。

  • meter:跟踪平均吞吐量和一,五,十五分钟指数加权移动平均吞吐量;例如,微服务每秒运行多少个数据库查询。

  • histogram:计算值的分布。

  • timer:聚合计时持续时间并提供持续时间统计信息以及吞吐量统计信息。


该规范还定义了一个MetricRegistry类,用于存储度量数据和其他元数据信息。三个范围中的每一个都有一个MetricRegistry实例:base,vendor和application。



二、用注释创建特定于应用程序的度量标准


要在WildFly Swarm上运行的微服务中利用MicroProfile指标功能,请在pom.xml中包含microprofile依赖项。 这将加载MicroProfile 1.3中的所有可用规范。 如果使用WildFly Swarm物料清单,则无需指定版本,如以下示例所示:

<dependency>
	<groupId>org.wildfly.swarm</groupId>
	<artifactId>microprofile</artifactId>
</dependency>

MicroProfile指标规范提供了一种注册特定于应用程序的指标的方法,以允许应用程序公开应用程序范围中的指标。 这使得在应用程序代码本身内直接定义应用程序指标非常简单。 使用Java API在应用程序代码中配置这些指标,Java API定义MicroProfile指标注释。


该规范定义了在定义应用程序度量标准时使用的以下注释:

微服务系列十三终结篇:如何为微服务增加监控指标?_java

表中描述的每个注释都支持以下选项,您可以使用这些选项指定必要的元数据属性:


字符串名称(可选)

设置度量标准的名称。如果未明确给出,则服务器使用带注释的对象的名称。


布尔绝对

如果设置为true,则服务器使用给定名称作为度量标准的绝对名称。如果设置为false,则服务器会在给定名称前面添加包名称和类名称。默认值为false。


String displayName(可选)

度量标准的显示名称。


字符串描述(可选)

度量标准的描述。


字符串单位

指标的单位。对于@Gauge注释,不提供默认值。检查MetricUnits类以获取一组预定义单位。


String []标签(可选)

<key> = <value>格式的String对象数组,用于为度量标准提供特殊标记。


布尔值可重用

表示具有特定名称的度量标准是否可以在多个位置注册。不适用于仪表。


以下示例代码包括使用MicroProfile指标注释定义的四个应用程序指标:

package com.example;
import javax.inject.Inject;

import org.eclipse.microprofile.metrics.Counter;
import org.eclipse.microprofile.metrics.annotation.Metric;

public class Colours {

	@Inject
	@Metric
	Counter redCount;

	@Inject
	@Metric(name="blue")
	Counter blueCount;

	@Inject
	@Metric(absolute=true)
	Counter greenCount;

	@Inject
	@Metric(name="purple", absolute=true)
	Counter purpleCount;

}

上述类在metrics注册表中生成以下条目:

com.example.Colours.redCount
com.example.Colours.blue
greenCount
purple



三、使用HTTP访问度量标准数据


MicroProfile指标规范包括许多REST端点,这些端点仅通过包含微缩样或微缩样度量分数在WildFly群上自动公开。所有指标HTTP端点必须实现与它们返回的HTTP响应代码相同的逻辑,如规范中所定义。可能的HTTP响应代码包括:


200

表示成功检索对象。


204

指示检索将存在但没有内容的sub-tree 。例如,如果特定于应用程序的sub-tree 没有定义特定于应用程序的度量标准。


404

表示检索不存在的直接寻址项。这可能是不存在的sub-tree 或不存在的对象。


406

表示服务器无法处理请求中的HTTP Accept Header。


500

表示由于内部服务器错误导致请求失败。


以下端点会自动显示。如果要以JSON格式检索数据,请记住指定HTTP Accept标头,其值为application / json。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_02

当使用JSON格式时,REST API响应HTTP GET请求,其数据以树状方式格式化,子资源使用子树。 不包含任何不包含数据的子树。


例如,如果您访问/ metrics端点并请求JSON数据,则响应包括每个范围的包装器:

{
  "application":
    {
      "hitCount": 45
    },
  "base":
    {
      "thread.count" : 33,
      "thread.max.count" : 47
    },
  "vendor":
    {...}
}



四、实验展现:将度量标准添加到微服务

通过JBDS导入一个maven项目:

通过展开JBoss Developer Studio左侧窗格中Project Explorer选项卡中的microservice-session项打开SessionResource类,然后单击microservice-session→Java Resources→src / main / java→io.microprofile.showcase.session将其展开。 双击SessionResource.java文件


微服务系列十三终结篇:如何为微服务增加监控指标?_java_03

注释@Metric注释的requestCount属性以配置计数器度量。 将度量标准命名为requestCount。

@Inject
@Metric(name = "requestCount", description = "David Says:All JAX-RS request made to the SessionResource",displayName = "SessionResource#requestCount")

更新allSessions方法以增加请求数。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_04

在SessionResource类中实现和配置直方图度量。


注入MetricRegistry实例以配置直方图。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_05

在generateHistogram方法中,将度量标准类型配置为MetricType.HISTOGRAM。

private void generateHistogram(Collection<Session> sessions){
    //register a new histogram
    Histogram abstractWordCount = metrics.histogram(metadata);
    ...
}

从SessionResource类配置getSessionNumber方法以定义计量度量标准。 使用@Gauge注释注释getSessionsNumber方法。

//Add the Gauge metric

@Gauge(name = "sessionNumber", description = "The number of sessions",displayName = "The number of sessions", unit = MetricUnits.NONE)

public int getSessionsNumber(){    return sessionStore.getSessions().size(); }

编译运行应用:

微服务系列十三终结篇:如何为微服务增加监控指标?_java_06

微服务系列十三终结篇:如何为微服务增加监控指标?_java_07



在工作站VM上启动Firefox,然后单击浏览器工具栏中的RESTClient插件。


选择GET作为方法。 在URL表单中,输入http:// localhost:8080 / sessions。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_08

单击“发送”四次以增加用于监视对微服务发出的请求数的计数器。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_09

在顶部导航栏中,单击“Headers”,然后单击“Custom Header.”。


使用以下值填写“请求标头”表单:


姓名:Accept


属性值:application / json。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_10

微服务系列十三终结篇:如何为微服务增加监控指标?_java_11

微服务系列十三终结篇:如何为微服务增加监控指标?_java_12

在URL表单中,输入http:// localhost:8080 / metrics / base,然后单击“发送”。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_13

验证“响应”选项卡是否列出了MicroProfile指标分数提供的系统指标。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_14

在URL表单中,输入http:// localhost:8080 / metrics / vendor,然后单击“发送”

微服务系列十三终结篇:如何为微服务增加监控指标?_java_15

验证“响应”选项卡是否列出了WildFly MicroProfile指标分数提供的特定于供应商的指标。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_16

在URL表单中,输入http:// localhost:8080 / metrics / application,然后单击“发送”。

微服务系列十三终结篇:如何为微服务增加监控指标?_java_17