传统的RHQ设置假定计算机上存在代理和代理插件(在RHQ中为“平台”)。 然后,插件与托管资源(例如,AS7服务器)进行通信; 向其询问指标值或运行操作(例如“重新启动”)。 本文在JBoss Developer Framework的Ticket Monster应用程序示例中展示了一种监视应用程序的替代方法。
插件和托管资源之间的通信协议取决于该资源的功能。 如果资源是Java进程,则通常使用JMX。 对于JBoss AS 7,我们使用基于HTTP协议的DMR。 对于
其他种类的资源,如果是数据库,也可以是文件访问或jdbc。 下图显示了此设置。
代理插件与托管资源进行对话并从中获取指标。 代理从多个资源中收集指标,然后将其批量发送到RHQ服务器,在该服务器中对其进行存储,处理以进行警报,并可以在UI中查看或通过CLI和REST-api检索。
延伸
上面的场景当然不限于基础结构,还可以用于监视内部的应用程序,例如AS7。 您可以编写一个使用基础连接与资源进行对话并从那里收集统计信息的插件(如果您是基于jmx或as7插件构建的,则不一定需要编写Java代码)。 这也意味着您需要在应用程序中添加钩子,以导出度量标准并使其在管理模型(经典jre中的MBean-Server; AS7中的DMR模型)中可用,以便插件可以检索它们。
从应用程序推送
监视应用程序数据的另一种方法是使应用程序将数据直接推送到RHQ服务器。 在这种情况下,您仍然需要一个插件描述符来定义RHQ服务器中的元数据(存在哪些类型的资源和指标,指标具有哪些单位等)。 在这种情况下,您只需要定义描述符,而无需为插件编写Java代码。 这是通过从No-op插件继承而来的 。 除此之外,您还可以将该描述符部署为无jar插件 。 下图显示了设置:
在这种情况下,您仍然可以在平台上使用带有插件的代理,但这不是必需的(但建议用于基本的基础结构监视)。 在服务器端,我们部署ticket-monster插件描述符 。 TicketMonster应用程序已得到增强,可以将每个预订作为两个度量指标(用于售出的机票总数和预订的总价)推送到RHQ服务器( BookingService .createBooking())。
@Stateless
public class BookingService extends BaseEntityService<Booking> {
@Inject
private RhqClient rhqClient;
public Response createBooking(BookingRequest bookingRequest) {
[…]
// Persist the booking, including cascaded relationships
booking.setPerformance(performance);
booking.setCancellationCode("abc");
getEntityManager().persist(booking);
newBookingEvent.fire(booking);
rhqClient.reportBooking(booking);
return Response.ok().entity(booking)
.type(MediaType.APPLICATION_JSON_TYPE).build();
该推送通过与RHQ服务器的REST-api的http连接进行,该连接在RhqClient
单例bean中定义。 在此RhqClient bean中,我们在启动时读取rhq.properties
文件,以确定是否应该有任何报告以及如何访问服务器。 如果启用了报告,我们将尝试找到正在运行的平台,如果RHQ服务器不知道该平台,请创建该平台。 在平台之上,我们创建TicketMonster实例。 这是安全的,可以多次执行,就像创建平台一样–我正在寻找一个现有的平台,在该平台上,代理可能已经监视了诸如cpu使用率或磁盘使用率之类的基本数据。 指标的报告如下所示:
@Asynchronous
public void reportBooking(Booking booking) {
if (reportTo && initialized) {
List<Metric> metrics = new ArrayList<Metric>(2);
Metric m = new Metric("tickets",
System.currentTimeMillis(),
(double) booking.getTickets().size());
metrics.add(m);
m = new Metric("price",
System.currentTimeMillis(),
(double) booking.getTotalTicketPrice());
metrics.add(m);
sendMetrics(metrics, ticketMonsterServerId);
}
}
基本上,我们构造两个Metric
对象,然后将它们发送到RHQ-Server。 第二个参数是RHQ服务器中TicketMonster服务器资源的资源ID,这是我们从上面提到的创建请求中获得的。 与传统设置不同的是,在RHQ内部的MeasurementData
对象始终具有关联的所谓的计划ID,在上述情况下,我们传递的是部署描述符中出现的度量标准名称,然后让RHQ服务器对计划ID进行排序。
<metric property="tickets" dataType="measurement"
displayType="summary" description="Total number tickets sold"/>
<metric property="price"
displayType="summary" description="Total selling price"/>
瞧瞧这是从TicketMonster内部的Bot创建的销售情况:
显示间隔已设置为“过去12分钟”。 如果您看到酒吧,则表示在12分钟/ 60个时隙= 12秒的时间段内,有多个预订。 在这种情况下,条形图显示最大值和最小值,而里面的小圆点显示平均值(通过Rest-Api,仍然可以查看最近7天的各个值)。
我为什么要这样做?
这里的问题当然是为什么我要将业务指标发送到通常用于基础结构监视的RHQ服务器? 因为我们可以! 认真地,这样的业务指标也能够指出问题。 例如,如果机票预订单的数量异常多或少,这也可能会引起关注并发出警报。 举一个电子商店的例子,该商店出售电子产品,碰巧有人打错字并提供笔记本电脑,通常售价为1300欧元,现在的售价为130欧元。 该消息通过社交网络Swift传播,销售额比正常数字增长了三倍。 在这里,监控笔记本电脑的销售数量可能会有所帮助。 另一个原因是RHQ及其用户概念允许设置特殊用户,这些用户只能(读取)TicketMonster资源,而不能访问RHQ内部的其他资源。 这样,可以使业务人员可以通过监视票证销售来访问度量。
在左侧,您会看到平台'snert'下方的资源树,其中包含所有资源,例如'rhqadmin'用户看到的。 在右侧,您将以用户身份看到树,该树仅具有查看TicketMonster服务器(™')的权限。
待办事项
以上是启动此概念的概念证明。 还有一些事情要做:
- 为表演创建子资源并单独报告其预订
- 定期报告TicketMonster服务器的可用性
- 更好地分离仍然存在于
RhqClient
类中的内部代码 - 将以上内容合并到TicketMonster propper中-当前它位于我的私人github存储库中
- 确定如何更好地处理暂时不可用的RHQ服务器
- 当一个类或字段为此有一些特殊注释时,请让Forge自动创建“发送度量/…”代码。 对于创建新项目(例如™案例中的表演)也是如此。
如果要尝试,则需要最新的RHQ主副本-即将发布的RHQ 4.6版本将在RHQ端进行一些必要的更改。 RHQ 4.6 beta还没有它们。
参考: 监控与地区总部的怪物从我们JCG伙伴的Heiko鲁普在有些事情要记住博客。
翻译自: https://www.javacodegeeks.com/2013/04/monitoring-the-monster-with-rhq.html