Fix `EventHookCallback` build event: build the layer from `Service's Layer` (#11413)

This commit is contained in:
Wan Kai 2023-10-16 19:02:50 +08:00 committed by GitHub
parent 0bbdd376b2
commit 3270d18fe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 57 additions and 10 deletions

View File

@ -21,6 +21,8 @@
* Fix table exists check in the JDBC Storage Plugin. * Fix table exists check in the JDBC Storage Plugin.
* Enhance extensibility of HTTP Server library. * Enhance extensibility of HTTP Server library.
* Adjust `AlarmRecord` alarmMessage column length to 512. * Adjust `AlarmRecord` alarmMessage column length to 512.
* Fix `EventHookCallback` build event: build the layer from `Service's Layer`.
* Fix `AlarmCore` doAlarm: catch exception for each callback to avoid interruption.
#### UI #### UI

View File

@ -93,7 +93,11 @@ public class AlarmCore {
if (!alarmMessageList.isEmpty()) { if (!alarmMessageList.isEmpty()) {
for (AlarmCallback callback : allCallbacks) { for (AlarmCallback callback : allCallbacks) {
callback.doAlarm(alarmMessageList); try {
callback.doAlarm(alarmMessageList);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
} }
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -18,15 +18,17 @@
package org.apache.skywalking.oap.server.core.alarm.provider; package org.apache.skywalking.oap.server.core.alarm.provider;
import java.io.IOException;
import org.apache.skywalking.apm.network.event.v3.Event; import org.apache.skywalking.apm.network.event.v3.Event;
import org.apache.skywalking.apm.network.event.v3.Source; import org.apache.skywalking.apm.network.event.v3.Source;
import org.apache.skywalking.apm.network.event.v3.Type; import org.apache.skywalking.apm.network.event.v3.Type;
import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerModule; import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerModule;
import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerService; import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerService;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.alarm.AlarmCallback; import org.apache.skywalking.oap.server.core.alarm.AlarmCallback;
import org.apache.skywalking.oap.server.core.alarm.AlarmMessage; 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.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.source.DefaultScopeDefine; 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.ModuleManager;
@ -41,22 +43,36 @@ import java.util.UUID;
public class EventHookCallback implements AlarmCallback { public class EventHookCallback implements AlarmCallback {
private final ModuleManager manager; private final ModuleManager manager;
private MetadataQueryService metadataQueryService;
private MetadataQueryService getMetadataQueryService() {
if (metadataQueryService == null) {
this.metadataQueryService = manager.find(CoreModule.NAME)
.provider()
.getService(MetadataQueryService.class);
}
return metadataQueryService;
}
public EventHookCallback(ModuleManager manager) { public EventHookCallback(ModuleManager manager) {
this.manager = manager; this.manager = manager;
} }
@Override @Override
public void doAlarm(List<AlarmMessage> alarmMessage) { public void doAlarm(List<AlarmMessage> alarmMessage) throws Exception {
EventAnalyzerService analyzerService = manager.find(EventAnalyzerModule.NAME).provider().getService(EventAnalyzerService.class); EventAnalyzerService analyzerService = manager.find(EventAnalyzerModule.NAME).provider().getService(EventAnalyzerService.class);
alarmMessage.forEach(a -> { for (AlarmMessage a : alarmMessage) {
for (Event event : constructCurrentEvent(a)) { for (Event event : constructCurrentEvent(a)) {
analyzerService.analyze(event); analyzerService.analyze(event);
} }
}); }
} }
private List<Event> constructCurrentEvent(AlarmMessage msg) { private String getLayer(String serviceId) throws IOException {
return getMetadataQueryService().getService(serviceId).getLayers().iterator().next();
}
private List<Event> constructCurrentEvent(AlarmMessage msg) throws IOException {
List<Event> events = new ArrayList<>(2); List<Event> events = new ArrayList<>(2);
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Event.Builder builder = Event.newBuilder() Event.Builder builder = Event.newBuilder()
@ -65,8 +81,7 @@ public class EventHookCallback implements AlarmCallback {
.setStartTime(now - (msg.getPeriod() * 60 * 1000)) .setStartTime(now - (msg.getPeriod() * 60 * 1000))
.setMessage(msg.getAlarmMessage()) .setMessage(msg.getAlarmMessage())
.setType(Type.Error) .setType(Type.Error)
.setEndTime(now) .setEndTime(now);
.setLayer(Layer.GENERAL.name());
switch (msg.getScopeId()) { switch (msg.getScopeId()) {
case DefaultScopeDefine.SERVICE : case DefaultScopeDefine.SERVICE :
IDManager.ServiceID.ServiceIDDefinition serviceIdDef = IDManager.ServiceID.analysisId(msg.getId0()); IDManager.ServiceID.ServiceIDDefinition serviceIdDef = IDManager.ServiceID.analysisId(msg.getId0());
@ -75,6 +90,7 @@ public class EventHookCallback implements AlarmCallback {
.setService(serviceIdDef.getName()) .setService(serviceIdDef.getName())
.build() .build()
); );
builder.setLayer(getLayer(msg.getId0()));
events.add(builder.build()); events.add(builder.build());
break; break;
case DefaultScopeDefine.SERVICE_RELATION : case DefaultScopeDefine.SERVICE_RELATION :
@ -91,6 +107,7 @@ public class EventHookCallback implements AlarmCallback {
.setService(destServiceIdDef.getName()) .setService(destServiceIdDef.getName())
.build() .build()
).setUuid(UUID.randomUUID().toString()); ).setUuid(UUID.randomUUID().toString());
builder.setLayer(getLayer(sourceServiceIdDef.isReal() ? msg.getId0() : msg.getId1()));
events.add(builder.build()); events.add(builder.build());
break; break;
case DefaultScopeDefine.SERVICE_INSTANCE : case DefaultScopeDefine.SERVICE_INSTANCE :
@ -101,6 +118,7 @@ public class EventHookCallback implements AlarmCallback {
.setService(IDManager.ServiceID.analysisId(instanceIdDef.getServiceId()).getName()) .setService(IDManager.ServiceID.analysisId(instanceIdDef.getServiceId()).getName())
.build() .build()
); );
builder.setLayer(getLayer(instanceIdDef.getServiceId()));
events.add(builder.build()); events.add(builder.build());
break; break;
case DefaultScopeDefine.SERVICE_INSTANCE_RELATION : case DefaultScopeDefine.SERVICE_INSTANCE_RELATION :
@ -119,6 +137,8 @@ public class EventHookCallback implements AlarmCallback {
.setService(IDManager.ServiceID.analysisId(destInstanceIdDef.getServiceId()).getName()) .setService(IDManager.ServiceID.analysisId(destInstanceIdDef.getServiceId()).getName())
.build() .build()
).setUuid(UUID.randomUUID().toString()); ).setUuid(UUID.randomUUID().toString());
IDManager.ServiceID.ServiceIDDefinition srcInstanceServiceIdDef = IDManager.ServiceID.analysisId(sourceInstanceIdDef.getServiceId());
builder.setLayer(getLayer(srcInstanceServiceIdDef.isReal() ? sourceInstanceIdDef.getServiceId() : destInstanceIdDef.getServiceId()));
events.add(builder.build()); events.add(builder.build());
break; break;
case DefaultScopeDefine.ENDPOINT : case DefaultScopeDefine.ENDPOINT :
@ -129,6 +149,7 @@ public class EventHookCallback implements AlarmCallback {
.setService(IDManager.ServiceID.analysisId(endpointIDDef.getServiceId()).getName()) .setService(IDManager.ServiceID.analysisId(endpointIDDef.getServiceId()).getName())
.build() .build()
); );
builder.setLayer(getLayer(endpointIDDef.getServiceId()));
events.add(builder.build()); events.add(builder.build());
break; break;
case DefaultScopeDefine.ENDPOINT_RELATION : case DefaultScopeDefine.ENDPOINT_RELATION :
@ -147,6 +168,8 @@ public class EventHookCallback implements AlarmCallback {
.setService(IDManager.ServiceID.analysisId(destEndpointIDDef.getServiceId()).getName()) .setService(IDManager.ServiceID.analysisId(destEndpointIDDef.getServiceId()).getName())
.build() .build()
).setUuid(UUID.randomUUID().toString()); ).setUuid(UUID.randomUUID().toString());
IDManager.ServiceID.ServiceIDDefinition srcEndpointServiceIdDef = IDManager.ServiceID.analysisId(sourceEndpointIDDef.getServiceId());
builder.setLayer(getLayer(srcEndpointServiceIdDef.isReal() ? sourceEndpointIDDef.getServiceId() : destEndpointIDDef.getServiceId()));
events.add(builder.build()); events.add(builder.build());
break; break;
} }

View File

@ -21,8 +21,12 @@ package org.apache.skywalking.oap.server.core.alarm.provider;
import org.apache.skywalking.apm.network.event.v3.Event; 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.EventAnalyzerService;
import org.apache.skywalking.oap.server.analyzer.event.EventAnalyzerServiceImpl; 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.alarm.AlarmMessage;
import org.apache.skywalking.oap.server.core.analysis.IDManager; 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.core.source.DefaultScopeDefine;
import org.apache.skywalking.oap.server.library.module.ModuleManager; 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.ModuleProviderHolder;
@ -52,6 +56,8 @@ public class EventHookCallbackTest {
private EventAnalyzerService eventAnalyzerService = mock(EventAnalyzerServiceImpl.class); private EventAnalyzerService eventAnalyzerService = mock(EventAnalyzerServiceImpl.class);
private MetadataQueryService metadataQueryService = mock(MetadataQueryService.class);
@Test @Test
public void testEventCallbackHasRightFlow() throws Exception { public void testEventCallbackHasRightFlow() throws Exception {
List<AlarmMessage> msgs = mockAlarmMessagesHasSingleElement(); List<AlarmMessage> msgs = mockAlarmMessagesHasSingleElement();
@ -59,7 +65,9 @@ public class EventHookCallbackTest {
when(moduleManager.find("event-analyzer")).thenReturn(moduleProviderHolder); when(moduleManager.find("event-analyzer")).thenReturn(moduleProviderHolder);
when(moduleProviderHolder.provider()).thenReturn(moduleServiceHolder); when(moduleProviderHolder.provider()).thenReturn(moduleServiceHolder);
when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(mockEventAnalyzerService); when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(mockEventAnalyzerService);
when(moduleManager.find(CoreModule.NAME)).thenReturn(moduleProviderHolder);
when(moduleServiceHolder.getService(MetadataQueryService.class)).thenReturn(metadataQueryService);
when(metadataQueryService.getService(any())).thenReturn(mockService());
//make sure current service be called. //make sure current service be called.
callback.doAlarm(msgs); callback.doAlarm(msgs);
verify(mockEventAnalyzerService).analyze(any(Event.class)); verify(mockEventAnalyzerService).analyze(any(Event.class));
@ -79,12 +87,15 @@ public class EventHookCallbackTest {
} }
@Test @Test
public void testRelationEventBeProperlyConstructed() { public void testRelationEventBeProperlyConstructed() throws Exception {
List<AlarmMessage> msgs = mockAlarmMessagesHasSourceAndDest(); List<AlarmMessage> msgs = mockAlarmMessagesHasSourceAndDest();
EventHookCallback callback = new EventHookCallback(this.moduleManager); EventHookCallback callback = new EventHookCallback(this.moduleManager);
when(moduleManager.find("event-analyzer")).thenReturn(moduleProviderHolder); when(moduleManager.find("event-analyzer")).thenReturn(moduleProviderHolder);
when(moduleProviderHolder.provider()).thenReturn(moduleServiceHolder); when(moduleProviderHolder.provider()).thenReturn(moduleServiceHolder);
when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(eventAnalyzerService); when(moduleServiceHolder.getService(EventAnalyzerService.class)).thenReturn(eventAnalyzerService);
when(moduleManager.find(CoreModule.NAME)).thenReturn(moduleProviderHolder);
when(moduleServiceHolder.getService(MetadataQueryService.class)).thenReturn(metadataQueryService);
when(metadataQueryService.getService(any())).thenReturn(mockService());
callback.doAlarm(msgs); callback.doAlarm(msgs);
ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class); ArgumentCaptor<Event> argument = ArgumentCaptor.forClass(Event.class);
@ -123,6 +134,13 @@ public class EventHookCallbackTest {
return Arrays.asList(msg); return Arrays.asList(msg);
} }
private Service mockService() {
Service service = new Service();
service.setName("test-skywalking");
service.getLayers().add(Layer.GENERAL.name());
return service;
}
class MockEventAnalyzerService implements EventAnalyzerService { class MockEventAnalyzerService implements EventAnalyzerService {
@Override @Override