@RequestMapping("/push/state")
    public ObjectNode pushState(@RequestParam(required = false) boolean detail,
            @RequestParam(required = false) boolean reset) {
        ObjectNode result = JacksonUtils.createEmptyJsonNode();
        int failedPushCount = MetricsMonitor.getFailedPushMonitor().get();
        int totalPushCount = MetricsMonitor.getTotalPushMonitor().get();
        result.put("succeed", totalPushCount - failedPushCount);
        result.put("total", totalPushCount);
        if (totalPushCount > 0) {
            result.put("ratio", ((float) totalPushCount - failedPushCount) / totalPushCount);
        } else {
            result.put("ratio", 0);
        }
        if (detail) {
            ObjectNode detailNode = JacksonUtils.createEmptyJsonNode();
            detailNode.put("avgPushCost", MetricsMonitor.getAvgPushCostMonitor().get());
            detailNode.put("maxPushCost", MetricsMonitor.getMaxPushCostMonitor().get());
            result.replace("detail", detailNode);
        }
        if (reset) {
            MetricsMonitor.resetPush();
        }
        result.put("reset", reset);
        return result;
    }
@Test
    void testPushState() {
        MetricsMonitor.resetPush();
        ObjectNode objectNode = operatorController.pushState(true, true);
        assertTrue(objectNode.toString().contains("succeed\":0"));
    }