blob: ea908c88f0cf3147398bc9c973bd4f5ce2a3e4b4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.servicecomb.metrics.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import org.apache.servicecomb.core.SCBEngine;
import org.apache.servicecomb.core.definition.MicroserviceMeta;
import org.apache.servicecomb.core.definition.OperationMeta;
import org.apache.servicecomb.core.executor.GroupExecutor;
import org.apache.servicecomb.foundation.common.utils.BeanUtils;
import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.context.ApplicationContext;
import com.netflix.spectator.api.DefaultRegistry;
import com.netflix.spectator.api.ManualClock;
import com.netflix.spectator.api.Registry;
import com.netflix.spectator.api.patterns.PolledMeter;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
public class TestThreadPoolMetersInitializer {
GlobalRegistry globalRegistry = new GlobalRegistry();
Registry registry = new DefaultRegistry(new ManualClock());
ThreadPoolMetersInitializer threadPoolMetersInitializer = new ThreadPoolMetersInitializer();
ThreadPoolExecutor threadPoolExecutor = Mockito.mock(ThreadPoolExecutor.class);
@Mocked
BlockingQueue<Runnable> queue;
@Mocked
GroupExecutor groupExecutor;
ExecutorService executor = Mockito.mock(ExecutorService.class);
@Mocked
ApplicationContext applicationContext;
@Mocked
MicroserviceMeta microserviceMeta;
@Mocked
OperationMeta operationMetaExecutor;
@Mocked
OperationMeta operationMetaSameExecutor;
@Mocked
OperationMeta operationMetaFixedThreadExecutor;
@Test
public void init() {
new Expectations(SCBEngine.class) {
{
SCBEngine.getInstance().getProducerMicroserviceMeta();
result = microserviceMeta;
}
};
Map<String, Executor> beanExecutors = new HashMap<>();
beanExecutors.put("executor", executor);
beanExecutors.put("groupExecutor", groupExecutor);
beanExecutors.put("threadPoolExecutor", threadPoolExecutor);
new Expectations(BeanUtils.class) {
{
BeanUtils.getContext();
result = applicationContext;
applicationContext.getBeansOfType(Executor.class);
result = beanExecutors;
}
};
Mockito.when(threadPoolExecutor.getQueue()).thenReturn(queue);
new Expectations() {
{
microserviceMeta.getOperations();
result = Arrays.asList(operationMetaExecutor, operationMetaSameExecutor, operationMetaFixedThreadExecutor);
operationMetaExecutor.getExecutor();
result = executor;
operationMetaSameExecutor.getExecutor();
result = executor;
operationMetaFixedThreadExecutor.getExecutor();
result = groupExecutor;
groupExecutor.getExecutorList();
result = Arrays.asList(threadPoolExecutor);
queue.size();
result = 10d;
}
};
new MockUp<ScheduledThreadPoolExecutor>() {
@Mock
void delayedExecute(RunnableScheduledFuture<?> task) {
}
};
globalRegistry.add(registry);
threadPoolMetersInitializer.init(globalRegistry, null, null);
PolledMeter.update(registry);
List<String> result = new ArrayList<>();
registry.iterator().forEachRemaining(meter -> result.add(meter.measure().toString()));
MatcherAssert.assertThat(result,
Matchers.containsInAnyOrder("[Measurement(threadpool.maxThreads:id=groupExecutor-group0,0,0.0)]",
"[Measurement(threadpool.rejectedTaskCount:id=groupExecutor-group0,0,0.0)]",
"[Measurement(threadpool.completedTaskCount:id=groupExecutor-group0,0,0.0)]",
"[Measurement(threadpool.currentThreadsBusy:id=groupExecutor-group0,0,0.0)]",
"[Measurement(threadpool.corePoolSize:id=groupExecutor-group0,0,0.0)]",
"[Measurement(threadpool.poolSize:id=groupExecutor-group0,0,0.0)]",
"[Measurement(threadpool.queueSize:id=groupExecutor-group0,0,10.0)]",
"[Measurement(threadpool.taskCount:id=groupExecutor-group0,0,0.0)]"));
}
}