Skip to content

Commit 225afce

Browse files
committed
Adding insights data to metadataContext
1 parent 4a67b46 commit 225afce

File tree

3 files changed

+107
-55
lines changed

3 files changed

+107
-55
lines changed

enforcer-parent/enforcer/src/main/java/org/wso2/choreo/connect/enforcer/analytics/AnalyticsFilter.java

+79-53
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import org.apache.logging.log4j.ThreadContext;
2727
import org.wso2.carbon.apimgt.common.analytics.collectors.impl.GenericRequestDataCollector;
2828
import org.wso2.carbon.apimgt.common.analytics.exceptions.AnalyticsException;
29+
import org.wso2.carbon.apimgt.common.analytics.publishers.dto.Error;
30+
import org.wso2.carbon.apimgt.common.analytics.publishers.dto.enums.FaultCategory;
2931
import org.wso2.choreo.connect.enforcer.commons.model.AuthenticationContext;
3032
import org.wso2.choreo.connect.enforcer.commons.model.RequestContext;
3133
import org.wso2.choreo.connect.enforcer.config.ConfigHolder;
@@ -108,59 +110,7 @@ public void handleSuccessRequest(RequestContext requestContext) {
108110
Utils.setTag(analyticsSpan, APIConstants.LOG_TRACE_ID,
109111
ThreadContext.get(APIConstants.LOG_TRACE_ID));
110112
}
111-
String apiName = requestContext.getMatchedAPI().getName();
112-
String apiVersion = requestContext.getMatchedAPI().getVersion();
113-
String apiType = requestContext.getMatchedAPI().getApiType();
114-
AuthenticationContext authContext = AnalyticsUtils.getAuthenticationContext(requestContext);
115-
116-
requestContext.addMetadataToMap(MetadataConstants.API_ID_KEY, AnalyticsUtils.getAPIId(requestContext));
117-
requestContext.addMetadataToMap(MetadataConstants.API_CREATOR_KEY,
118-
AnalyticsUtils.setDefaultIfNull(authContext.getApiPublisher()));
119-
requestContext.addMetadataToMap(MetadataConstants.API_NAME_KEY, apiName);
120-
requestContext.addMetadataToMap(MetadataConstants.API_VERSION_KEY, apiVersion);
121-
requestContext.addMetadataToMap(MetadataConstants.API_TYPE_KEY, apiType);
122-
123-
requestContext.addMetadataToMap(MetadataConstants.API_CREATOR_TENANT_DOMAIN_KEY,
124-
APIConstants.SUPER_TENANT_DOMAIN_NAME);
125-
requestContext.addMetadataToMap(MetadataConstants.API_ENVIRONMENT_ID,
126-
requestContext.getMatchedAPI().getEnvironmentId() == null ? APIConstants.DEFAULT_ENVIRONMENT_NAME :
127-
requestContext.getMatchedAPI().getEnvironmentId());
128-
129-
// Default Value would be PRODUCTION
130-
requestContext.addMetadataToMap(MetadataConstants.APP_KEY_TYPE_KEY,
131-
authContext.getKeyType() == null ? APIConstants.API_KEY_TYPE_PRODUCTION : authContext.getKeyType());
132-
requestContext.addMetadataToMap(MetadataConstants.APP_UUID_KEY,
133-
AnalyticsUtils.setDefaultIfNull(authContext.getApplicationUUID()));
134-
requestContext.addMetadataToMap(MetadataConstants.APP_NAME_KEY,
135-
AnalyticsUtils.setDefaultIfNull(authContext.getApplicationName()));
136-
requestContext.addMetadataToMap(MetadataConstants.APP_OWNER_KEY,
137-
AnalyticsUtils.setDefaultIfNull(authContext.getSubscriber()));
138-
139-
requestContext.addMetadataToMap(MetadataConstants.CORRELATION_ID_KEY, requestContext.getRequestID());
140-
requestContext.addMetadataToMap(MetadataConstants.REGION_KEY,
141-
ConfigHolder.getInstance().getEnvVarConfig().getEnforcerRegionId());
142-
143-
// As in the matched API, only the resources under the matched resource template are selected.
144-
requestContext.addMetadataToMap(MetadataConstants.API_RESOURCE_TEMPLATE_KEY,
145-
requestContext.getMatchedResourcePath().getPath());
146-
147-
requestContext.addMetadataToMap(MetadataConstants.DESTINATION, resolveEndpoint(requestContext));
148-
149-
requestContext.addMetadataToMap(MetadataConstants.API_ORGANIZATION_ID,
150-
requestContext.getMatchedAPI().getOrganizationId());
151-
// Adding UserName and the APIContext
152-
String endUserName = requestContext.getAuthenticationContext().getUsername();
153-
requestContext.addMetadataToMap(MetadataConstants.API_USER_NAME_KEY,
154-
endUserName == null ? APIConstants.END_USER_UNKNOWN : endUserName);
155-
requestContext.addMetadataToMap(MetadataConstants.API_CONTEXT_KEY,
156-
requestContext.getMatchedAPI().getBasePath());
157-
requestContext.addMetadataToMap(MetadataConstants.DEPLOYMENT_TYPE,
158-
requestContext.getMatchedAPI().getDeploymentType());
159-
160-
// Adding Gateway URL
161-
String gatewayUrl = requestContext.getHeaders().get(GATEWAY_URL);
162-
requestContext.addMetadataToMap(MetadataConstants.GATEWAY_URL,
163-
gatewayUrl);
113+
this.addInsightsMetaData(requestContext);
164114
} finally {
165115
if (Utils.tracingEnabled()) {
166116
analyticsSpanScope.close();
@@ -188,11 +138,13 @@ public void handleFailureRequest(RequestContext requestContext) {
188138
ThreadContext.get(APIConstants.LOG_TRACE_ID));
189139

190140
}
141+
this.addInsightsMetaData(requestContext);
191142
if (publisher == null) {
192143
logger.error("Cannot publish the failure event as analytics publisher is null.");
193144
return;
194145
}
195146
ChoreoFaultAnalyticsProvider provider = new ChoreoFaultAnalyticsProvider(requestContext);
147+
this.addFailureDetailsToInsightsMetaData(requestContext, provider);
196148
// To avoid incrementing counter for options call
197149
if (provider.getProxyResponseCode() == 200 || provider.getProxyResponseCode() == 204) {
198150
return;
@@ -212,6 +164,80 @@ public void handleFailureRequest(RequestContext requestContext) {
212164
}
213165
}
214166

167+
private void addInsightsMetaData(RequestContext requestContext) {
168+
String apiName = requestContext.getMatchedAPI().getName();
169+
String apiVersion = requestContext.getMatchedAPI().getVersion();
170+
String apiType = requestContext.getMatchedAPI().getApiType();
171+
String projectId = requestContext.getMatchedAPI().getChoreoComponentInfo().getProjectID();
172+
String componentId = requestContext.getMatchedAPI().getChoreoComponentInfo().getComponentID();
173+
String versionId = requestContext.getMatchedAPI().getChoreoComponentInfo().getVersionID();
174+
175+
AuthenticationContext authContext = AnalyticsUtils.getAuthenticationContext(requestContext);
176+
177+
requestContext.addMetadataToMap(MetadataConstants.API_PROJECT_ID_KEY, projectId);
178+
requestContext.addMetadataToMap(MetadataConstants.API_COMPONENT_ID_KEY, componentId);
179+
requestContext.addMetadataToMap(MetadataConstants.API_VERSION_ID_KEY, versionId);
180+
181+
requestContext.addMetadataToMap(MetadataConstants.API_ID_KEY, AnalyticsUtils.getAPIId(requestContext));
182+
requestContext.addMetadataToMap(MetadataConstants.API_CREATOR_KEY,
183+
AnalyticsUtils.setDefaultIfNull(authContext.getApiPublisher()));
184+
requestContext.addMetadataToMap(MetadataConstants.API_NAME_KEY, apiName);
185+
requestContext.addMetadataToMap(MetadataConstants.API_VERSION_KEY, apiVersion);
186+
requestContext.addMetadataToMap(MetadataConstants.API_TYPE_KEY, apiType);
187+
188+
requestContext.addMetadataToMap(MetadataConstants.API_CREATOR_TENANT_DOMAIN_KEY,
189+
APIConstants.SUPER_TENANT_DOMAIN_NAME);
190+
requestContext.addMetadataToMap(MetadataConstants.API_ENVIRONMENT_ID,
191+
requestContext.getMatchedAPI().getEnvironmentId() == null ? APIConstants.DEFAULT_ENVIRONMENT_NAME :
192+
requestContext.getMatchedAPI().getEnvironmentId());
193+
194+
// Default Value would be PRODUCTION
195+
requestContext.addMetadataToMap(MetadataConstants.APP_KEY_TYPE_KEY,
196+
authContext.getKeyType() == null ? APIConstants.API_KEY_TYPE_PRODUCTION : authContext.getKeyType());
197+
requestContext.addMetadataToMap(MetadataConstants.APP_UUID_KEY,
198+
AnalyticsUtils.setDefaultIfNull(authContext.getApplicationUUID()));
199+
requestContext.addMetadataToMap(MetadataConstants.APP_NAME_KEY,
200+
AnalyticsUtils.setDefaultIfNull(authContext.getApplicationName()));
201+
requestContext.addMetadataToMap(MetadataConstants.APP_OWNER_KEY,
202+
AnalyticsUtils.setDefaultIfNull(authContext.getSubscriber()));
203+
204+
requestContext.addMetadataToMap(MetadataConstants.CORRELATION_ID_KEY, requestContext.getRequestID());
205+
requestContext.addMetadataToMap(MetadataConstants.REGION_KEY,
206+
ConfigHolder.getInstance().getEnvVarConfig().getEnforcerRegionId());
207+
208+
// As in the matched API, only the resources under the matched resource template are selected.
209+
requestContext.addMetadataToMap(MetadataConstants.API_RESOURCE_TEMPLATE_KEY,
210+
requestContext.getMatchedResourcePath().getPath());
211+
212+
requestContext.addMetadataToMap(MetadataConstants.DESTINATION, resolveEndpoint(requestContext));
213+
214+
requestContext.addMetadataToMap(MetadataConstants.API_ORGANIZATION_ID,
215+
requestContext.getMatchedAPI().getOrganizationId());
216+
// Adding UserName and the APIContext
217+
String endUserName = requestContext.getAuthenticationContext().getUsername();
218+
requestContext.addMetadataToMap(MetadataConstants.API_USER_NAME_KEY,
219+
endUserName == null ? APIConstants.END_USER_UNKNOWN : endUserName);
220+
requestContext.addMetadataToMap(MetadataConstants.API_CONTEXT_KEY,
221+
requestContext.getMatchedAPI().getBasePath());
222+
requestContext.addMetadataToMap(MetadataConstants.DEPLOYMENT_TYPE,
223+
requestContext.getMatchedAPI().getDeploymentType());
224+
225+
// Adding Gateway URL
226+
String gatewayUrl = requestContext.getHeaders().get(GATEWAY_URL);
227+
requestContext.addMetadataToMap(MetadataConstants.GATEWAY_URL,
228+
gatewayUrl);
229+
}
230+
231+
private void addFailureDetailsToInsightsMetaData(RequestContext requestContext,
232+
ChoreoFaultAnalyticsProvider provider) {
233+
FaultCategory faultCategory = provider.getFaultType();
234+
Error error = provider.getError(faultCategory);
235+
236+
requestContext.addMetadataToMap(MetadataConstants.INSIGHTS_ERROR_TYPE, faultCategory.toString());
237+
requestContext.addMetadataToMap(MetadataConstants.INSIGHTS_ERROR_CODE, String.valueOf(error.getErrorCode()));
238+
requestContext.addMetadataToMap(MetadataConstants.INSIGHTS_ERROR_MESSAGE, error.getErrorMessage().toString());
239+
}
240+
215241
private static AnalyticsEventPublisher loadAnalyticsPublisher(String className, boolean isChoreoDeployment) {
216242

217243
// For the choreo deployment, class name need not to be provided.

enforcer-parent/enforcer/src/main/java/org/wso2/choreo/connect/enforcer/api/RestAPI.java

+20-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.logging.log4j.LogManager;
2121
import org.apache.logging.log4j.Logger;
2222
import org.wso2.choreo.connect.discovery.api.Api;
23+
import org.wso2.choreo.connect.discovery.api.ChoreoComponentInfo;
2324
import org.wso2.choreo.connect.discovery.api.Operation;
2425
import org.wso2.choreo.connect.discovery.api.Resource;
2526
import org.wso2.choreo.connect.discovery.api.Scopes;
@@ -146,6 +147,9 @@ public String init(Api api) {
146147
api.getEndpointSecurity().getSandBoxSecurityInfo()));
147148
}
148149

150+
org.wso2.choreo.connect.enforcer.commons.model.ChoreoComponentInfo choreoComponentInfo = getChoreoComponentInfo(
151+
api);
152+
149153
this.apiLifeCycleState = api.getApiLifeCycleState();
150154
this.apiConfig = new APIConfig.Builder(name).uuid(api.getId()).vhost(vhost).basePath(basePath).version(version)
151155
.resources(resources).apiType(apiType).apiLifeCycleState(apiLifeCycleState).tier(api.getTier())
@@ -156,12 +160,26 @@ public String init(Api api) {
156160
.enableBackendJWT(api.getEnableBackendJWT()).backendJWTConfiguration(backendJWTConfiguration)
157161
.deploymentType(api.getDeploymentType())
158162
.environmentId(api.getEnvironmentId())
159-
.environmentName(api.getEnvironmentName()).build();
163+
.environmentName(api.getEnvironmentName())
164+
.choreoComponentInfo(choreoComponentInfo)
165+
.build();
160166

161167
initFilters();
162168
return basePath;
163169
}
164170

171+
private static org.wso2.choreo.connect.enforcer.commons.model.ChoreoComponentInfo getChoreoComponentInfo(
172+
Api api) {
173+
ChoreoComponentInfo infoProto = api.getChoreoComponentInfo();
174+
org.wso2.choreo.connect.enforcer.commons.model.ChoreoComponentInfo choreoComponentInfo =
175+
new org.wso2.choreo.connect.enforcer.commons.model.ChoreoComponentInfo();
176+
choreoComponentInfo.setOrganizationID(infoProto.getOrganizationID());
177+
choreoComponentInfo.setProjectID(infoProto.getProjectID());
178+
choreoComponentInfo.setComponentID(infoProto.getComponentID());
179+
choreoComponentInfo.setVersionID(infoProto.getVersionID());
180+
return choreoComponentInfo;
181+
}
182+
165183
@Override
166184
public ResponseObject process(RequestContext requestContext) {
167185
ResponseObject responseObject = new ResponseObject(requestContext.getRequestID());
@@ -206,8 +224,8 @@ public ResponseObject process(RequestContext requestContext) {
206224
}
207225
if (analyticsEnabled && !FilterUtils.isSkippedAnalyticsFaultEvent(responseObject.getErrorCode())) {
208226
AnalyticsFilter.getInstance().handleFailureRequest(requestContext);
209-
responseObject.setMetaDataMap(new HashMap<>(0));
210227
}
228+
responseObject.setMetaDataMap(requestContext.getMetadataMap());
211229
}
212230

213231
return responseObject;

enforcer-parent/enforcer/src/main/java/org/wso2/choreo/connect/enforcer/constants/MetadataConstants.java

+8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ public class MetadataConstants {
2525
public static final String EXT_AUTH_METADATA_CONTEXT_KEY = "envoy.filters.http.ext_authz";
2626

2727
public static final String WSO2_METADATA_PREFIX = "x-wso2-";
28+
29+
public static final String API_PROJECT_ID_KEY = WSO2_METADATA_PREFIX + "project-id";
30+
public static final String API_COMPONENT_ID_KEY = WSO2_METADATA_PREFIX + "component-id";
31+
public static final String API_VERSION_ID_KEY = WSO2_METADATA_PREFIX + "version-id";
32+
public static final String INSIGHTS_ERROR_TYPE = WSO2_METADATA_PREFIX + "error-type";
33+
public static final String INSIGHTS_ERROR_CODE = WSO2_METADATA_PREFIX + "error-code";
34+
public static final String INSIGHTS_ERROR_MESSAGE = WSO2_METADATA_PREFIX + "error-message";
35+
2836
public static final String API_ID_KEY = WSO2_METADATA_PREFIX + "api-id";
2937
public static final String API_CREATOR_KEY = WSO2_METADATA_PREFIX + "api-creator";
3038
public static final String API_NAME_KEY = WSO2_METADATA_PREFIX + "api-name";

0 commit comments

Comments
 (0)