blob: de333eccb78831b2e8fadd79651a31cd285acc7f [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.skywalking.oap.server.core.alarm.provider;
import org.apache.skywalking.apm.network.event.v3.Event;
import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerService;
import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerServiceImpl;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.analysis.Layer;
import org.apache.skywalking.oap.server.core.query.MetadataQueryService;
import org.apache.skywalking.oap.server.core.query.type.Service;
import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.module.ModuleProviderHolder;
import org.apache.skywalking.oap.server.library.module.ModuleServiceHolder;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class EventHookCallbackTest {
private ModuleManager moduleManager = mock(ModuleManager.class);
private ModuleProviderHolder moduleProviderHolder = mock(ModuleProviderHolder.class);
private ModuleServiceHolder moduleServiceHolder = mock(ModuleServiceHolder.class);
private MockEventAnalyzerService mockEventAnalyzerService = mock(MockEventAnalyzerService.class);
private EventAnalyzerService eventAnalyzerService = mock(EventAnalyzerServiceImpl.class);
private MetadataQueryService metadataQueryService = mock(MetadataQueryService.class);
@Test
public void testEventCallbackHasRightFlow() throws Exception {
List<AlarmMessage> msgs = mockAlarmMessagesHasSingleElement();
EventHookCallback callback = new EventHookCallback(this.moduleManager);
when(moduleManager.find("event-analyzer")).thenReturn(moduleProviderHolder);
when(moduleProviderHolder.provider()).thenReturn(moduleServiceHolder);
when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(mockEventAnalyzerService);
when(moduleManager.find(CoreModule.NAME)).thenReturn(moduleProviderHolder);
when(moduleServiceHolder.getService(MetadataQueryService.class)).thenReturn(metadataQueryService);
Service service = mockService();
when(metadataQueryService.getService(service.getId())).thenReturn(service);
//make sure current service be called.
callback.doAlarm(msgs);
verify(mockEventAnalyzerService).analyze(any(Event.class));
when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(eventAnalyzerService);
callback.doAlarm(msgs);
//Ensure that the current Event is properly constructed
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
verify(eventAnalyzerService).analyze(argument.capture());
Event value = argument.getValue();
AlarmMessage msg = msgs.get(0);
assertEquals(msg.getName(), value.getSource().getService());
assertEquals("Alarm", value.getName());
assertEquals(msg.getAlarmMessage(), value.getMessage());
assertEquals(msg.getPeriod(), (value.getEndTime() - value.getStartTime()) / 1000 / 60);
assertEquals(service.getLayers().iterator().next(), value.getLayer());
}
@Test
public void testRelationEventBeProperlyConstructed() throws Exception {
List<AlarmMessage> msgs = mockAlarmMessagesHasSourceAndDest();
EventHookCallback callback = new EventHookCallback(this.moduleManager);
when(moduleManager.find("event-analyzer")).thenReturn(moduleProviderHolder);
when(moduleProviderHolder.provider()).thenReturn(moduleServiceHolder);
when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(eventAnalyzerService);
when(moduleManager.find(CoreModule.NAME)).thenReturn(moduleProviderHolder);
when(moduleServiceHolder.getService(MetadataQueryService.class)).thenReturn(metadataQueryService);
Service service = mockService();
when(metadataQueryService.getService(service.getId())).thenReturn(service);
callback.doAlarm(msgs);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
verify(eventAnalyzerService, times(2)).analyze(argument.capture());
List<Event> events = argument.getAllValues();
assertEquals(events.size(), 2);
Event sourceEvent = events.get(0);
Event destEvent = events.get(1);
AlarmMessage msg = msgs.get(0);
assertEquals(sourceEvent.getSource().getService(), IDManager.ServiceID.analysisId(msg.getId0()).getName());
assertEquals((sourceEvent.getEndTime() - sourceEvent.getStartTime()) / 1000 / 60, msg.getPeriod());
assertEquals(destEvent.getSource().getService(), IDManager.ServiceID.analysisId(msg.getId1()).getName());
assertEquals((destEvent.getEndTime() - destEvent.getStartTime()) / 1000 / 60, msg.getPeriod());
assertEquals(service.getLayers().iterator().next(), sourceEvent.getLayer());
assertEquals(Layer.UNDEFINED.name(), destEvent.getLayer());
}
private List<AlarmMessage> mockAlarmMessagesHasSingleElement() {
AlarmMessage msg = new AlarmMessage();
msg.setScopeId(DefaultScopeDefine.SERVICE);
msg.setScope("SERVICE");
msg.setName("test-skywalking");
msg.setId0("dGVzdC1za3l3YWxraW5n.1");
msg.setAlarmMessage("Alarm caused by Rule service_resp_time_rule");
msg.setPeriod(3);
return Arrays.asList(msg);
}
private List<AlarmMessage> mockAlarmMessagesHasSourceAndDest() {
AlarmMessage msg = new AlarmMessage();
msg.setScopeId(DefaultScopeDefine.SERVICE_RELATION);
msg.setScope("");
msg.setName("test-skywalking");
msg.setId0(IDManager.ServiceID.buildId("test-skywalking", true));
msg.setId1(IDManager.ServiceID.buildId("destIdStr", true));
msg.setAlarmMessage("Alarm caused by Rule service_resp_time_rule");
msg.setPeriod(5);
return Arrays.asList(msg);
}
private Service mockService() {
Service service = new Service();
service.setName("test-skywalking");
service.setId(IDManager.ServiceID.buildId(service.getName(), true));
service.getLayers().add(Layer.GENERAL.name());
return service;
}
class MockEventAnalyzerService implements EventAnalyzerService {
@Override
public void analyze(Event event) {
//ignore current mock process.
}
}
}