Siddhi统计功能使用求助:配置后未输出预期统计结果
排查Siddhi统计结果未输出的问题
我来帮你梳理下Siddhi统计功能不生效的常见问题和解决办法,结合你给出的代码片段,重点看这几个点:
1. 统计时间间隔的单位配置错误
你用了@App:statistics(interval = '1'),但Siddhi里统计间隔的默认单位是分钟,如果想设置1秒的话,必须明确指定单位:
@App:statistics(interval = '1 sec')
不然程序会每隔1分钟才生成一次统计,可能你等的时间不够,误以为没输出。
2. 窗口与聚合逻辑未正确配置
你的查询里#window.length(...)的参数是空的,而且没有配合聚合函数使用——统计是基于窗口内的事件计算的,得先定义窗口长度,再加上需要统计的指标:
- 比如
#window.length(5)表示保留最近5条事件 - 用
avg(price)、sum(volume)这类聚合函数计算统计值 - 记得按需要的维度分组(比如按
symbol分组统计单只股票)
3. 缺少统计结果的输出渠道
Siddhi不会自动打印统计数据,你需要定义一个输出流,配合sink把结果输出到控制台或其他存储:
@sink(type='log', prefix='STOCK_STATS:') define stream StockStatsStream (symbol string, avgPrice float, totalVolume long);
然后在查询里把聚合后的结果插入到这个流中。
修正后的完整代码示例
String siddhiApp = "@App:name('TestApp') " + "@App:statistics(interval = '1 sec') " + // 明确秒级统计间隔 "define stream StockEventStream (symbol string, price float, volume long); " + "@sink(type='log', prefix='STOCK_STATS:') " + // 控制台输出统计结果 "define stream StockStatsStream (symbol string, avgPrice float, totalVolume long); " + "@info(name = 'query1') " + "from StockEventStream#window.length(5) " + // 保留最近5条事件的窗口 "select symbol, avg(price) as avgPrice, sum(volume) as totalVolume " + // 统计指标 "group by symbol " + // 按股票代码分组 "insert into StockStatsStream;";
验证步骤
发送几条测试事件到StockEventStream:
{"symbol":"IBM", "price":150.5, "volume":1000} {"symbol":"IBM", "price":152.0, "volume":800} {"symbol":"GOOG", "price":2800.0, "volume":500}
之后就能在控制台看到STOCK_STATS:开头的统计输出,每1秒更新一次窗口内的计算结果。
内容的提问来源于stack exchange,提问作者Jin.J
相关产品推荐
相关产品推荐

