有效载荷滤波器/变换器&丰富的仪表

时间:2015-05-07 22:01:53

标签: spring-xd

我有一个JMS提要,它提供具有以下JSON结构的消息:

{String:currentSessions,Long:duration,Long:rows,Long:fill,Long:execute,String:source,String:category,String:url,String:hostname}

我想要做的是定义一个类似于下面的流,它将通过主机名称提供移动平均值:

stream create duration_gauge --definition "tap:stream:interceptor > object-to-json | transform --expression=#jsonPath(payload,'$.duration') | rich-gauge --nameExpression=#jsonPath(payload,'$.hostname')" --deploy

显然,这不起作用,因为有效载荷已经转换,不再包含主机名字段。

问题:

  1. 有没有办法在管道之间保存部分有效负载?我已经阅读了有关自定义标题的内容,但我没有看到创建和访问它们的文档化方法。
  2. 似乎我想要完成的唯一方法是为每个主机名创建一个流/富量表。这是最好的解决方案吗?
  3. 谢谢!

1 个答案:

答案 0 :(得分:2)

我认为这种情况应该更容易。我们应该将--valueExpression添加到rich-gauge。同时,你可以选择你建议的两种方案中的任何一种。 (2)不需要任何自定义,如果只有少数已知主机并且不太可能经常更改,则应该很简单。要实现(1),您可以创建自定义处理器模块来实现Spring Integration header-enricher并将其安装到custom-modules目录中。在这种情况下,我认为使用groovy script更简单,例如:

import groovy.json.JsonSlurper
import org.springframework.messaging.support.MessageBuilder

def slurper = new JsonSlurper()
def json = slurper.parseText(payload)
def enriched = [:]
enriched.putAll(headers)
enriched['hostName'] = json.hostName
return MessageBuilder.withPayload(payload).copyHeaders(enriched).build()

并将其另存为[XD_INSTALL_DIR] /xd/modules/processor/scripts/headerEnricher.groovy。 (注意payloadheaders变量会自动绑定到消息内容中。接下来创建并部署流。我用它来测试:

xd:> stream create test --definition "http | enrich:transform --script=headerEnricher.groovy | extract:transform --expression=#jsonPath(payload,'$.duration') |  rich-gauge --nameExpression=headers['hostName']" --deploy

发布一些数据:

xd:>http post --target http://localhost:9000 --data {"hostName":"someHost","duration":2.90}
xd:>http post --target http://localhost:9000 --data {"hostName":"someHost","duration":1.50}
xd:>http post --target http://localhost:9000 --data {"hostName":"anotherHost","duration":1.33}
xd:>http post --target http://localhost:9000 --data {"hostName":"anotherHost","duration":2.345}

显示结果:

 xd:>rich-gauge display someHost
 xd:>rich-gauge display anotherHost