我有一个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
显然,这不起作用,因为有效载荷已经转换,不再包含主机名字段。
问题:
谢谢!
答案 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。 (注意payload
和headers
变量会自动绑定到消息内容中。接下来创建并部署流。我用它来测试:
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