Skip to content

Commit 613fa87

Browse files
committed
feat: add endpoint to expose analytics definitions
see https://gravitee.atlassian.net/browse/GKO-1579
1 parent 1831f44 commit 613fa87

File tree

22 files changed

+2732
-2134
lines changed

22 files changed

+2732
-2134
lines changed

gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,18 @@
293293
<inputSpec>${project.basedir}/src/main/resources/openapi/openapi-installation-deprecated.yaml</inputSpec>
294294
</configuration>
295295
</execution>
296+
<execution>
297+
<id>model-analytics</id>
298+
<goals>
299+
<goal>generate</goal>
300+
</goals>
301+
<configuration>
302+
<inputSpec>${project.basedir}/src/main/resources/openapi/openapi-analytics.yaml</inputSpec>
303+
<modelPackage>${openapi.modelPackage}.analytics.engine</modelPackage>
304+
</configuration>
305+
</execution>
296306
</executions>
307+
297308
</plugin>
298309
</plugins>
299310
</build>

gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/src/main/java/io/gravitee/rest/api/management/v2/rest/GraviteeManagementV2Application.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import io.gravitee.rest.api.management.v2.rest.provider.ObjectMapperResolver;
3434
import io.gravitee.rest.api.management.v2.rest.provider.YamlWriter;
3535
import io.gravitee.rest.api.management.v2.rest.resource.OpenAPIResource;
36+
import io.gravitee.rest.api.management.v2.rest.resource.analytics.definition.AnalyticsDefinitionResource;
3637
import io.gravitee.rest.api.management.v2.rest.resource.api.ApisResource;
3738
import io.gravitee.rest.api.management.v2.rest.resource.application.ApplicationsResource;
3839
import io.gravitee.rest.api.management.v2.rest.resource.asyncjob.AsyncJobsResource;
@@ -73,6 +74,7 @@ public GraviteeManagementV2Application() {
7374
register(EnvironmentsResource.class);
7475
register(ApisResource.class);
7576
register(ApplicationsResource.class);
77+
register(AnalyticsDefinitionResource.class);
7678

7779
// Resources deprecated at root level
7880
register(EndpointsResource.class);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright © 2015 The Gravitee team (http://gravitee.io)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.gravitee.rest.api.management.v2.rest.mapper;
17+
18+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpec;
19+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpecsResponse;
20+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FacetSpec;
21+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FacetSpecsResponse;
22+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FilterSpec;
23+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FilterSpecsResponse;
24+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricSpec;
25+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricSpecsResponse;
26+
import java.util.List;
27+
import org.mapstruct.Mapper;
28+
import org.mapstruct.factory.Mappers;
29+
30+
@Mapper
31+
public interface AnalyticsDefinitionMapper {
32+
AnalyticsDefinitionMapper INSTANCE = Mappers.getMapper(AnalyticsDefinitionMapper.class);
33+
34+
ApiSpec mapApiSpec(io.gravitee.apim.core.analytics.model.engine.ApiSpec apiSpec);
35+
36+
List<ApiSpec> mapApiSpecs(List<io.gravitee.apim.core.analytics.model.engine.ApiSpec> apiSpecs);
37+
38+
default ApiSpecsResponse toApiSpecsResponse(List<io.gravitee.apim.core.analytics.model.engine.ApiSpec> apiSpecs) {
39+
return new ApiSpecsResponse().data(mapApiSpecs(apiSpecs));
40+
}
41+
42+
MetricSpec mapMetricSpec(io.gravitee.apim.core.analytics.model.engine.MetricSpec metricSpec);
43+
44+
List<MetricSpec> mapMetricSpecs(List<io.gravitee.apim.core.analytics.model.engine.MetricSpec> metricSpecs);
45+
46+
default MetricSpecsResponse toMetricSpecsResponse(List<io.gravitee.apim.core.analytics.model.engine.MetricSpec> metricSpecs) {
47+
return new MetricSpecsResponse().data(mapMetricSpecs(metricSpecs));
48+
}
49+
50+
FacetSpec mapFacetSpec(io.gravitee.apim.core.analytics.model.engine.FacetSpec facetSpec);
51+
52+
List<FacetSpec> mapFacetSpecs(List<io.gravitee.apim.core.analytics.model.engine.FacetSpec> facetSpecs);
53+
54+
default FacetSpecsResponse toFacetSpecsResponse(List<io.gravitee.apim.core.analytics.model.engine.FacetSpec> facetSpecs) {
55+
return new FacetSpecsResponse().data(mapFacetSpecs(facetSpecs));
56+
}
57+
58+
FilterSpec mapFilterSpec(io.gravitee.apim.core.analytics.model.engine.FilterSpec filterSpec);
59+
60+
List<FilterSpec> mapFilterSpecs(List<io.gravitee.apim.core.analytics.model.engine.FilterSpec> filterSpecs);
61+
62+
default FilterSpecsResponse toFilterSpecsResponse(List<io.gravitee.apim.core.analytics.model.engine.FilterSpec> filterSpecs) {
63+
return new FilterSpecsResponse().data(mapFilterSpecs(filterSpecs));
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright © 2015 The Gravitee team (http://gravitee.io)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.gravitee.rest.api.management.v2.rest.resource.analytics.definition;
17+
18+
import io.gravitee.apim.core.analytics.use_case.engine.GetApiMetricsUseCase;
19+
import io.gravitee.apim.core.analytics.use_case.engine.GetApiSpecsUseCase;
20+
import io.gravitee.apim.core.analytics.use_case.engine.GetMetricFacetsUseCase;
21+
import io.gravitee.apim.core.analytics.use_case.engine.GetMetricFiltersUseCase;
22+
import io.gravitee.rest.api.management.v2.rest.mapper.AnalyticsDefinitionMapper;
23+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiName;
24+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpec;
25+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.ApiSpecsResponse;
26+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FacetSpecsResponse;
27+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.FilterSpecsResponse;
28+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricName;
29+
import io.gravitee.rest.api.management.v2.rest.model.analytics.engine.MetricSpecsResponse;
30+
import io.gravitee.rest.api.model.permissions.RolePermission;
31+
import io.gravitee.rest.api.model.permissions.RolePermissionAction;
32+
import io.gravitee.rest.api.rest.annotation.Permission;
33+
import io.gravitee.rest.api.rest.annotation.Permissions;
34+
import jakarta.inject.Inject;
35+
import jakarta.validation.Valid;
36+
import jakarta.ws.rs.GET;
37+
import jakarta.ws.rs.Path;
38+
import jakarta.ws.rs.PathParam;
39+
import jakarta.ws.rs.Produces;
40+
import jakarta.ws.rs.core.MediaType;
41+
42+
public class AnalyticsDefinitionResource {
43+
44+
@Inject
45+
GetApiSpecsUseCase getApiSpecsUseCase;
46+
47+
@Inject
48+
GetApiMetricsUseCase getApiMetricsUseCase;
49+
50+
@Inject
51+
GetMetricFacetsUseCase getMetricFacetsUseCase;
52+
53+
@Inject
54+
GetMetricFiltersUseCase getMetricFiltersUseCase;
55+
56+
@Path("/apis")
57+
@GET
58+
@Produces(MediaType.APPLICATION_JSON)
59+
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
60+
public ApiSpecsResponse getApiSpecs() {
61+
return AnalyticsDefinitionMapper.INSTANCE.toApiSpecsResponse(getApiSpecsUseCase.execute().specs());
62+
}
63+
64+
@Path("/apis/{apiName}/metrics")
65+
@GET
66+
@Produces(MediaType.APPLICATION_JSON)
67+
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
68+
public MetricSpecsResponse getApiMetrics(@PathParam("apiName") String apiName) {
69+
return AnalyticsDefinitionMapper.INSTANCE.toMetricSpecsResponse(
70+
getApiMetricsUseCase.execute(new GetApiMetricsUseCase.Input(apiName)).specs()
71+
);
72+
}
73+
74+
@Path("/metrics/{metricName}/facets")
75+
@GET
76+
@Produces(MediaType.APPLICATION_JSON)
77+
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
78+
public FacetSpecsResponse getMetricFacets(@PathParam("metricName") String metricName) {
79+
return AnalyticsDefinitionMapper.INSTANCE.toFacetSpecsResponse(
80+
getMetricFacetsUseCase.execute(new GetMetricFacetsUseCase.Input(metricName)).specs()
81+
);
82+
}
83+
84+
@Path("/metrics/{metricName}/filters")
85+
@GET
86+
@Produces(MediaType.APPLICATION_JSON)
87+
@Permissions({ @Permission(value = RolePermission.API_ANALYTICS, acls = { RolePermissionAction.READ }) })
88+
public FilterSpecsResponse getMetricFilters(@PathParam("apiName") String apiName, @PathParam("metricName") String metricName) {
89+
return AnalyticsDefinitionMapper.INSTANCE.toFilterSpecsResponse(
90+
getMetricFiltersUseCase.execute(new GetMetricFiltersUseCase.Input(metricName)).specs()
91+
);
92+
}
93+
}

gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/src/main/java/io/gravitee/rest/api/management/v2/rest/resource/environment/EnvironmentAnalyticsResource.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
import io.gravitee.rest.api.management.v2.rest.model.EnvironmentAnalyticsTopAppsByRequestCountResponse;
3333
import io.gravitee.rest.api.management.v2.rest.model.EnvironmentAnalyticsTopFailedApisResponse;
3434
import io.gravitee.rest.api.management.v2.rest.model.EnvironmentAnalyticsTopHitsApisResponse;
35+
import io.gravitee.rest.api.management.v2.rest.resource.analytics.definition.AnalyticsDefinitionResource;
3536
import io.gravitee.rest.api.management.v2.rest.resource.environment.param.TimeRangeParam;
37+
import io.gravitee.rest.api.management.v2.rest.resource.plugin.PoliciesResource;
3638
import io.gravitee.rest.api.model.permissions.RolePermission;
3739
import io.gravitee.rest.api.model.permissions.RolePermissionAction;
3840
import io.gravitee.rest.api.rest.annotation.Permission;
@@ -45,13 +47,18 @@
4547
import jakarta.ws.rs.Path;
4648
import jakarta.ws.rs.Produces;
4749
import jakarta.ws.rs.QueryParam;
50+
import jakarta.ws.rs.container.ResourceContext;
51+
import jakarta.ws.rs.core.Context;
4852
import jakarta.ws.rs.core.MediaType;
4953
import java.time.Duration;
5054
import java.time.Instant;
5155
import java.util.Map;
5256

5357
public class EnvironmentAnalyticsResource {
5458

59+
@Context
60+
private ResourceContext resourceContext;
61+
5562
@Inject
5663
SearchEnvironmentResponseStatusRangesUseCase searchEnvironmentResponseStatusRangesUseCase;
5764

@@ -193,4 +200,9 @@ public EnvironmentAnalyticsTopFailedApisResponse getTopFailedApis(@BeanParam @Va
193200

194201
return EnvironmentAnalyticsMapper.INSTANCE.map(topFailedApis);
195202
}
203+
204+
@Path("/definition")
205+
public AnalyticsDefinitionResource getAnalyticsDefinitionApisResource() {
206+
return resourceContext.getResource(AnalyticsDefinitionResource.class);
207+
}
196208
}

0 commit comments

Comments
 (0)