public void process() {
        // Check agent information
        if (StringUtils.isEmpty(service) || StringUtil.isEmpty(serviceInstance) || timestamp == null) {
            return;
        }

        // Get all meter builders.
        final List<MetricConvert> converts = processService.converts();
        if (CollectionUtils.isEmpty(converts)) {
            return;
        }

        try {
            converts.forEach(convert -> convert.toMeter(meters.entrySet().stream().collect(toImmutableMap(
                Map.Entry::getKey,
                v -> SampleFamilyBuilder.newBuilder(
                    v.getValue().stream().map(s -> s.build(service, serviceInstance, timestamp)).toArray(Sample[]::new)
                ).defaultHistogramBucketUnit(TimeUnit.MILLISECONDS).build()
            ))));
        } catch (Exception e) {
            log.warn("Process meters failure.", e);
        }
    }
@Test
    public void testProcess() {
        AtomicReference<AvgHistogramFunction> data = new AtomicReference<>();
        doAnswer(invocationOnMock -> {
            if (AvgHistogramFunction.class.isAssignableFrom(invocationOnMock.getArgument(0).getClass())) {
                data.set(invocationOnMock.getArgument(0));
            }
            return null;
        }).when(meterSystem).doStreamingCalculation(any());
        processor.read(MeterData.newBuilder()
                        .setService(service)
                        .setServiceInstance(serviceInstance)
                        .setTimestamp(System.currentTimeMillis())
                        .setHistogram(MeterHistogram.newBuilder()
                                .setName("test_histogram")
                                .addValues(MeterBucketValue.newBuilder().setIsNegativeInfinity(true).setCount(10).build())
                                .addValues(MeterBucketValue.newBuilder().setBucket(0).setCount(20).build())
                                .addValues(MeterBucketValue.newBuilder().setBucket(10).setCount(10).build())
                                .build())
                .build());
        processor.process();

        // verify data
        final AvgHistogramFunction func = data.get();
        final DataTable summation = new DataTable();
        summation.put(Bucket.INFINITE_NEGATIVE, 10L);
        summation.put("0", 20L);
        summation.put("10", 10L);
        Assertions.assertEquals(summation, func.getSummation());
        final DataTable count = new DataTable();
        count.put(Bucket.INFINITE_NEGATIVE, 1L);
        count.put("0", 1L);
        count.put("10", 1L);
        Assertions.assertEquals(count, func.getCount());
    }