Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@
import inmemory.SharedPolicyGroupCrudServiceInMemory;
import inmemory.SharedPolicyGroupHistoryCrudServiceInMemory;
import inmemory.spring.InMemoryConfiguration;
import io.gravitee.apim.core.analytics.domain_service.engine.definition.AnalyticsDefinition;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetApiMetricsUseCase;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetApiSpecsUseCase;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetMetricFacetsUseCase;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetMetricFiltersUseCase;
import io.gravitee.apim.core.api.domain_service.ApiExportDomainService;
import io.gravitee.apim.core.api.domain_service.ApiImportDomainService;
import io.gravitee.apim.core.api.domain_service.ApiMetadataDecoderDomainService;
Expand Down Expand Up @@ -129,6 +134,7 @@
import io.gravitee.apim.core.subscription.use_case.RejectSubscriptionUseCase;
import io.gravitee.apim.infra.adapter.SubscriptionAdapter;
import io.gravitee.apim.infra.adapter.SubscriptionAdapterImpl;
import io.gravitee.apim.infra.domain_service.analytics.AnalyticsDefinitionDomainServiceImpl;
import io.gravitee.apim.infra.domain_service.application.ValidateApplicationSettingsDomainServiceImpl;
import io.gravitee.apim.infra.domain_service.documentation.ValidatePageSourceDomainServiceImpl;
import io.gravitee.apim.infra.domain_service.group.ValidateGroupCRDDomainServiceImpl;
Expand Down Expand Up @@ -874,4 +880,29 @@ public CockpitPromotionServiceProvider cockpitPromotionServiceProvider() {
public CreatePromotionUseCase createPromotionUseCase() {
return mock(CreatePromotionUseCase.class);
}

@Bean
public AnalyticsDefinition analyticsDefinitionDomainService() {
return new AnalyticsDefinitionDomainServiceImpl();
}

@Bean
public GetApiSpecsUseCase getApiSpecsUseCase(AnalyticsDefinition analyticsDefinition) {
return new GetApiSpecsUseCase(analyticsDefinition);
}

@Bean
public GetApiMetricsUseCase getApiMetricsUseCase(AnalyticsDefinition analyticsDefinition) {
return new GetApiMetricsUseCase(analyticsDefinition);
}

@Bean
public GetMetricFiltersUseCase getMetricFiltersUseCase(AnalyticsDefinition analyticsDefinition) {
return new GetMetricFiltersUseCase(analyticsDefinition);
}

@Bean
public GetMetricFacetsUseCase getMetricFacetsUseCase(AnalyticsDefinition analyticsDefinition) {
return new GetMetricFacetsUseCase(analyticsDefinition);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,18 @@
<inputSpec>${project.basedir}/src/main/resources/openapi/openapi-installation-deprecated.yaml</inputSpec>
</configuration>
</execution>
<execution>
<id>model-analytics</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/openapi/openapi-analytics.yaml</inputSpec>
<modelPackage>${openapi.modelPackage}.analytics.engine</modelPackage>
</configuration>
</execution>
</executions>

</plugin>
</plugins>
</build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import io.gravitee.rest.api.management.v2.rest.provider.ObjectMapperResolver;
import io.gravitee.rest.api.management.v2.rest.provider.YamlWriter;
import io.gravitee.rest.api.management.v2.rest.resource.OpenAPIResource;
import io.gravitee.rest.api.management.v2.rest.resource.analytics.definition.AnalyticsDefinitionResource;
import io.gravitee.rest.api.management.v2.rest.resource.api.ApisResource;
import io.gravitee.rest.api.management.v2.rest.resource.application.ApplicationsResource;
import io.gravitee.rest.api.management.v2.rest.resource.asyncjob.AsyncJobsResource;
Expand Down Expand Up @@ -73,6 +74,7 @@ public GraviteeManagementV2Application() {
register(EnvironmentsResource.class);
register(ApisResource.class);
register(ApplicationsResource.class);
register(AnalyticsDefinitionResource.class);

// Resources deprecated at root level
register(EndpointsResource.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Copyright © 2015 The Gravitee team (http://gravitee.io)
*
* Licensed 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 io.gravitee.rest.api.management.v2.rest.mapper;

import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpec;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpecsResponse;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FacetSpec;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FacetSpecsResponse;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FilterSpec;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FilterSpecsResponse;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricSpec;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricSpecsResponse;
import java.util.List;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface AnalyticsDefinitionMapper {
AnalyticsDefinitionMapper INSTANCE = Mappers.getMapper(AnalyticsDefinitionMapper.class);

ApiSpec mapApiSpec(io.gravitee.apim.core.analytics.model.engine.definition.ApiSpec apiSpec);

List<ApiSpec> mapApiSpecs(List<io.gravitee.apim.core.analytics.model.engine.definition.ApiSpec> apiSpecs);

default ApiSpecsResponse toApiSpecsResponse(List<io.gravitee.apim.core.analytics.model.engine.definition.ApiSpec> apiSpecs) {
return new ApiSpecsResponse().data(mapApiSpecs(apiSpecs));
}

MetricSpec mapMetricSpec(io.gravitee.apim.core.analytics.model.engine.definition.MetricSpec metricSpec);

List<MetricSpec> mapMetricSpecs(List<io.gravitee.apim.core.analytics.model.engine.definition.MetricSpec> metricSpecs);

default MetricSpecsResponse toMetricSpecsResponse(
List<io.gravitee.apim.core.analytics.model.engine.definition.MetricSpec> metricSpecs
) {
return new MetricSpecsResponse().data(mapMetricSpecs(metricSpecs));
}

FacetSpec mapFacetSpec(io.gravitee.apim.core.analytics.model.engine.definition.FacetSpec facetSpec);

List<FacetSpec> mapFacetSpecs(List<io.gravitee.apim.core.analytics.model.engine.definition.FacetSpec> facetSpecs);

default FacetSpecsResponse toFacetSpecsResponse(List<io.gravitee.apim.core.analytics.model.engine.definition.FacetSpec> facetSpecs) {
return new FacetSpecsResponse().data(mapFacetSpecs(facetSpecs));
}

FilterSpec mapFilterSpec(io.gravitee.apim.core.analytics.model.engine.definition.FilterSpec filterSpec);

List<FilterSpec> mapFilterSpecs(List<io.gravitee.apim.core.analytics.model.engine.definition.FilterSpec> filterSpecs);

default FilterSpecsResponse toFilterSpecsResponse(
List<io.gravitee.apim.core.analytics.model.engine.definition.FilterSpec> filterSpecs
) {
return new FilterSpecsResponse().data(mapFilterSpecs(filterSpecs));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright © 2015 The Gravitee team (http://gravitee.io)
*
* Licensed 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 io.gravitee.rest.api.management.v2.rest.resource.analytics.definition;

import io.gravitee.apim.core.analytics.use_case.engine.definition.GetApiMetricsUseCase;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetApiSpecsUseCase;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetMetricFacetsUseCase;
import io.gravitee.apim.core.analytics.use_case.engine.definition.GetMetricFiltersUseCase;
import io.gravitee.rest.api.management.v2.rest.mapper.AnalyticsDefinitionMapper;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpecsResponse;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FacetSpecsResponse;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FilterSpecsResponse;
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricSpecsResponse;
import io.gravitee.rest.api.model.permissions.RolePermission;
import io.gravitee.rest.api.model.permissions.RolePermissionAction;
import io.gravitee.rest.api.rest.annotation.Permission;
import io.gravitee.rest.api.rest.annotation.Permissions;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

public class AnalyticsDefinitionResource {

@Inject
GetApiSpecsUseCase getApiSpecsUseCase;

@Inject
GetApiMetricsUseCase getApiMetricsUseCase;

@Inject
GetMetricFacetsUseCase getMetricFacetsUseCase;

@Inject
GetMetricFiltersUseCase getMetricFiltersUseCase;

@Path("/apis")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
public ApiSpecsResponse getApiSpecs() {
return AnalyticsDefinitionMapper.INSTANCE.toApiSpecsResponse(getApiSpecsUseCase.execute().specs());
}

@Path("/apis/{apiName}/metrics")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
public MetricSpecsResponse getApiMetrics(@PathParam("apiName") String apiName) {
return AnalyticsDefinitionMapper.INSTANCE.toMetricSpecsResponse(
getApiMetricsUseCase.execute(new GetApiMetricsUseCase.Input(apiName)).specs()
);
}

@Path("/metrics/{metricName}/facets")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
public FacetSpecsResponse getMetricFacets(@PathParam("metricName") String metricName) {
return AnalyticsDefinitionMapper.INSTANCE.toFacetSpecsResponse(
getMetricFacetsUseCase.execute(new GetMetricFacetsUseCase.Input(metricName)).specs()
);
}

@Path("/metrics/{metricName}/filters")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
public FilterSpecsResponse getMetricFilters(@PathParam("apiName") String apiName, @PathParam("metricName") String metricName) {
return AnalyticsDefinitionMapper.INSTANCE.toFilterSpecsResponse(
getMetricFiltersUseCase.execute(new GetMetricFiltersUseCase.Input(metricName)).specs()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
import io.gravitee.rest.api.management.v2.rest.model.EnvironmentAnalyticsTopAppsByRequestCountResponse;
import io.gravitee.rest.api.management.v2.rest.model.EnvironmentAnalyticsTopFailedApisResponse;
import io.gravitee.rest.api.management.v2.rest.model.EnvironmentAnalyticsTopHitsApisResponse;
import io.gravitee.rest.api.management.v2.rest.resource.analytics.definition.AnalyticsDefinitionResource;
import io.gravitee.rest.api.management.v2.rest.resource.environment.param.TimeRangeParam;
import io.gravitee.rest.api.management.v2.rest.resource.plugin.PoliciesResource;
import io.gravitee.rest.api.model.permissions.RolePermission;
import io.gravitee.rest.api.model.permissions.RolePermissionAction;
import io.gravitee.rest.api.rest.annotation.Permission;
Expand All @@ -45,13 +47,18 @@
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.container.ResourceContext;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import java.time.Duration;
import java.time.Instant;
import java.util.Map;

public class EnvironmentAnalyticsResource {

@Context
private ResourceContext resourceContext;

@Inject
SearchEnvironmentResponseStatusRangesUseCase searchEnvironmentResponseStatusRangesUseCase;

Expand Down Expand Up @@ -193,4 +200,9 @@ public EnvironmentAnalyticsTopFailedApisResponse getTopFailedApis(@BeanParam @Va

return EnvironmentAnalyticsMapper.INSTANCE.map(topFailedApis);
}

@Path("/definition")
public AnalyticsDefinitionResource getAnalyticsDefinitionApisResource() {
return resourceContext.getResource(AnalyticsDefinitionResource.class);
}
}
Loading