Skip to content

Commit e2afb79

Browse files
committed
fix: exclude non-proxy APIs from environment logs query
Filter environment logs to only include PROXY type APIs, excluding MESSAGE, NATIVE, MCP_PROXY, and LLM_PROXY API types. Add parameterized tests covering all non-proxy API type exclusions and an edge case for empty results when only non-proxy APIs exist. (cherry picked from commit 04f2c26)
1 parent 5c8cbf5 commit e2afb79

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/logs_engine/use_case/SearchEnvironmentLogsUseCase.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import io.gravitee.apim.core.user.domain_service.UserContextLoader;
4646
import io.gravitee.apim.core.user.model.UserContext;
4747
import io.gravitee.definition.model.DefinitionVersion;
48+
import io.gravitee.definition.model.v4.ApiType;
4849
import io.gravitee.rest.api.model.BaseApplicationEntity;
4950
import io.gravitee.rest.api.model.analytics.Range;
5051
import io.gravitee.rest.api.model.analytics.SearchLogsFilters;
@@ -196,7 +197,13 @@ private SearchLogsFilters buildFilters(UserContext userContext, SearchLogsReques
196197
}
197198
}
198199

199-
Set<String> apiIds = userContext.apis().orElseGet(Collections::emptyList).stream().map(Api::getId).collect(Collectors.toSet());
200+
Set<String> apiIds = userContext
201+
.apis()
202+
.orElseGet(Collections::emptyList)
203+
.stream()
204+
.filter(api -> api.getType() == ApiType.PROXY)
205+
.map(Api::getId)
206+
.collect(Collectors.toSet());
200207
filterContext.limitByApiIds(apiIds);
201208

202209
var builder = SearchLogsFilters.builder();

gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/core/logs_engine/use_case/SearchEnvironmentLogsUseCaseTest.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,67 @@ void should_allow_response_time_filter_with_zero_value() {
875875

876876
assertThat(filtersCaptor.getValue().responseTimeRanges()).isEqualTo(List.of(new Range(0L, 0L)));
877877
}
878+
879+
@ParameterizedTest
880+
@MethodSource("nonProxyApiProvider")
881+
void should_exclude_non_proxy_api_ids_from_filters(Api nonProxyApi) {
882+
when(userContextLoader.loadApis(any())).thenReturn(
883+
new UserContext(
884+
AUDIT_INFO,
885+
Optional.empty(),
886+
Optional.empty(),
887+
Optional.empty(),
888+
Optional.empty(),
889+
Optional.of(List.of(API1, nonProxyApi))
890+
)
891+
);
892+
when(connectionLogsCrudService.searchApiConnectionLogs(any(), any(), any(), any())).thenReturn(
893+
new io.gravitee.rest.api.model.v4.log.SearchLogsResponse<>(1, List.of(LOG1))
894+
);
895+
when(planCrudService.findByIds(any())).thenReturn(List.of());
896+
when(applicationCrudService.findByIds(any(), any())).thenReturn(List.of());
897+
when(logNamesPostProcessor.mapLogNames(any(), any())).thenAnswer(invocation -> invocation.getArgument(1));
898+
899+
var request = new SearchLogsRequest(null, null, 1, 10);
900+
useCase.execute(new Input(AUDIT_INFO, request));
901+
902+
var filtersCaptor = ArgumentCaptor.forClass(SearchLogsFilters.class);
903+
verify(connectionLogsCrudService).searchApiConnectionLogs(any(), filtersCaptor.capture(), any(), any());
904+
905+
assertThat(filtersCaptor.getValue().apiIds()).containsExactly(API1.getId()).doesNotContain(nonProxyApi.getId());
906+
}
907+
908+
static Stream<Arguments> nonProxyApiProvider() {
909+
return Stream.of(
910+
Arguments.of(ApiFixtures.aMessageApiV4().toBuilder().id("message-api").build()),
911+
Arguments.of(ApiFixtures.aNativeApi().toBuilder().id("native-api").build()),
912+
Arguments.of(ApiFixtures.aMCPProxyApiV4().toBuilder().id("mcp-api").build()),
913+
Arguments.of(ApiFixtures.aLLMProxyApiV4().toBuilder().id("llm-api").build())
914+
);
915+
}
916+
917+
@Test
918+
void should_return_empty_when_only_non_proxy_apis_exist() {
919+
var messageApi = ApiFixtures.aMessageApiV4().toBuilder().id("message-api").build();
920+
var nativeApi = ApiFixtures.aNativeApi().toBuilder().id("native-api").build();
921+
when(userContextLoader.loadApis(any())).thenReturn(
922+
new UserContext(
923+
AUDIT_INFO,
924+
Optional.empty(),
925+
Optional.empty(),
926+
Optional.empty(),
927+
Optional.empty(),
928+
Optional.of(List.of(messageApi, nativeApi))
929+
)
930+
);
931+
932+
var request = new SearchLogsRequest(null, null, 1, 10);
933+
var output = useCase.execute(new Input(AUDIT_INFO, request));
934+
935+
verify(connectionLogsCrudService, never()).searchApiConnectionLogs(any(), any(), any(), any());
936+
assertThat(output.response().data()).isEmpty();
937+
assertThat(output.response().pagination().totalCount()).isZero();
938+
}
878939
}
879940

880941
@Nested

0 commit comments

Comments
 (0)