有效载荷 Filters/Transforms 和丰富的仪表
Payload Filters/Transforms & Rich Gauges
我有一个 JMS 提要,它提供具有以下 JSON 结构的消息:
{ String:currentSessions, Long:duration, Long:rows, Long:fill, Long:execute, String:source, String:category, String:url, String:hostname }
我想做的是定义一个类似于以下内容的流,它将通过 rich-gauge:
按主机名提供移动平均线
stream create duration_gauge --definition "tap:stream:interceptor > object-to-json | transform --expression=#jsonPath(payload,'$.duration') | rich-gauge --nameExpression=#jsonPath(payload,'$.hostname')" --deploy
显然,这行不通,因为负载已经转换,不再包含主机名字段。
问题:
- 有没有办法在管道之间保存部分有效载荷?我读过有关自定义 headers 的内容,但我没有看到创建和访问它们的记录方式。
- 似乎我想要完成的唯一方法是为每个主机名创建一个 stream/rich-gauge。这是最好的解决方案吗?
谢谢!
我觉得这个案子应该更容易一些。我们应该将 --valueExpression
添加到 rich-gauge
。同时,您可以选择您建议的两种选择中的任何一种。 (2) 不需要任何定制,如果只有少数已知主机并且不太可能经常更改,则应该很简单。要实现 (1),您可以创建一个自定义处理器模块来实现 Spring 集成 header-enricher and install it into the custom-modules directory. In this case I think it is simpler to use a 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
和post一些数据:
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
我有一个 JMS 提要,它提供具有以下 JSON 结构的消息:
{ String:currentSessions, Long:duration, Long:rows, Long:fill, Long:execute, String:source, String:category, String:url, String:hostname }
我想做的是定义一个类似于以下内容的流,它将通过 rich-gauge:
按主机名提供移动平均线stream create duration_gauge --definition "tap:stream:interceptor > object-to-json | transform --expression=#jsonPath(payload,'$.duration') | rich-gauge --nameExpression=#jsonPath(payload,'$.hostname')" --deploy
显然,这行不通,因为负载已经转换,不再包含主机名字段。
问题:
- 有没有办法在管道之间保存部分有效载荷?我读过有关自定义 headers 的内容,但我没有看到创建和访问它们的记录方式。
- 似乎我想要完成的唯一方法是为每个主机名创建一个 stream/rich-gauge。这是最好的解决方案吗?
谢谢!
我觉得这个案子应该更容易一些。我们应该将 --valueExpression
添加到 rich-gauge
。同时,您可以选择您建议的两种选择中的任何一种。 (2) 不需要任何定制,如果只有少数已知主机并且不太可能经常更改,则应该很简单。要实现 (1),您可以创建一个自定义处理器模块来实现 Spring 集成 header-enricher and install it into the custom-modules directory. In this case I think it is simpler to use a 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
和post一些数据:
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