diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOnlyMessageReceiver.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOnlyMessageReceiver.java index 312a3fa494..6417d4a905 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOnlyMessageReceiver.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOnlyMessageReceiver.java @@ -24,6 +24,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.micro.integrator.dataservices.common.DBConstants; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; + +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_SERVICE_INDEX; /** * This class represents the Axis2 message receiver used to dispatch in-only service calls. @@ -42,26 +45,29 @@ public class DBInOnlyMessageReceiver extends RawXMLINOnlyMessageReceiver { * on invalid method (wrong signature) or behavior (return * null) */ - public void invokeBusinessLogic(MessageContext msgContext) throws AxisFault { - try { - if (log.isDebugEnabled()) { - log.debug("Request received to DSS: Data Service - " + msgContext.getServiceContext().getName() + - ", Operation - " + msgContext.getSoapAction() + ", Request body - " + - msgContext.getEnvelope().getText() + ", ThreadID - " + Thread.currentThread().getId()); - } - DataServiceProcessor.dispatch(msgContext); - msgContext.setProperty(DBConstants.TENANT_IN_ONLY_MESSAGE, Boolean.TRUE); - } catch (Exception e) { - log.error("Error in in-only message receiver", e); - msgContext.setProperty(Constants.FAULT_NAME, DBConstants.DS_FAULT_NAME); - throw DBUtils.createAxisFault(e); - } finally { - if (log.isDebugEnabled()) { - log.debug("Request processing completed from DSS: Data Service - " + - msgContext.getServiceContext().getName() + ", Operation - " + msgContext.getSoapAction() + - ", ThreadID - " + Thread.currentThread().getId()); - } - } - } - + public void invokeBusinessLogic(MessageContext msgContext) throws AxisFault { + try { + if (log.isDebugEnabled()) { + log.debug("Request received to DSS: Data Service - " + msgContext.getServiceContext().getName() + + ", Operation - " + msgContext.getSoapAction() + ", Request body - " + + msgContext.getEnvelope().getText() + ", ThreadID - " + Thread.currentThread().getId()); + } + DataServicesTracingCollector.reportEntryEvent(msgContext); + DataServiceProcessor.dispatch(msgContext); + msgContext.setProperty(DBConstants.TENANT_IN_ONLY_MESSAGE, Boolean.TRUE); + DataServicesTracingCollector.closeEntryEvent(msgContext, null); + } catch (Exception e) { + log.error("Error in in-only message receiver", e); + msgContext.setProperty(Constants.FAULT_NAME, DBConstants.DS_FAULT_NAME); + DataServicesTracingCollector.closeFlowForcefully(msgContext, DATA_SERVICE_INDEX, e); + throw DBUtils.createAxisFault(e); + } finally { + if (log.isDebugEnabled()) { + log.debug("Request processing completed from DSS: Data Service - " + + msgContext.getServiceContext().getName() + ", Operation - " + msgContext.getSoapAction() + + ", ThreadID - " + Thread.currentThread().getId()); + } + } + } + } diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOutMessageReceiver.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOutMessageReceiver.java index 1e7520d8e3..fc9b7972d8 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOutMessageReceiver.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBInOutMessageReceiver.java @@ -29,9 +29,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.micro.integrator.dataservices.common.DBConstants; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; import java.util.Map; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_SERVICE_INDEX; + /** * This class represents the Axis2 message receiver used to dispatch in-out service calls. */ @@ -59,6 +62,7 @@ public void invokeBusinessLogic(MessageContext msgContext, ", Operation - " + msgContext.getSoapAction() + ", Request body - " + msgContext.getEnvelope().getText() + ", ThreadID - " + Thread.currentThread().getId()); } + DataServicesTracingCollector.reportEntryEvent(msgContext); boolean isAcceptJson = false; Map transportHeaders = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS); if (transportHeaders != null) { @@ -91,9 +95,11 @@ public void invokeBusinessLogic(MessageContext msgContext, newMsgContext.setProperty(Constants.Configuration.MESSAGE_TYPE, HTTPConstants.MEDIA_TYPE_APPLICATION_JSON); } + DataServicesTracingCollector.closeEntryEvent(msgContext, result); } catch (Exception e) { log.error("Error in in-out message receiver", e); msgContext.setProperty(Constants.FAULT_NAME, DBConstants.DS_FAULT_NAME); + DataServicesTracingCollector.closeFlowForcefully(msgContext, DATA_SERVICE_INDEX, e); throw DBUtils.createAxisFault(e); } finally { if (msgContext.getProperty(DATA_SERVICE_LATENCY_TIMER) != null) { diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DataServiceProcessor.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DataServiceProcessor.java index d9c55d09e6..74883b687f 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DataServiceProcessor.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DataServiceProcessor.java @@ -26,6 +26,7 @@ import org.wso2.micro.integrator.dataservices.core.dispatch.DataServiceRequest; import org.wso2.micro.integrator.dataservices.core.dispatch.DispatchStatus; import org.wso2.micro.integrator.dataservices.core.engine.DataService; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; import javax.xml.namespace.QName; @@ -37,7 +38,8 @@ public class DataServiceProcessor { public static OMElement dispatch(MessageContext msgContext) throws DataServiceFault { DispatchStatus.clearRequestStatus(); DataServiceRequest request = DataServiceRequest.createDataServiceRequest(msgContext); - OMElement result = request.dispatch(); + DataServicesTracingCollector.reportQueryExecutionEvent(msgContext, request); + OMElement result = request.dispatch(msgContext); if (result == null) { DataService ds = request.getDataService(); String requestName = request.getRequestName(); @@ -46,6 +48,7 @@ public static OMElement dispatch(MessageContext msgContext) throws DataServiceFa result = generateRequestSuccessElement(); } } + DataServicesTracingCollector.closeQueryExecutionEvent(msgContext, result); return result; } diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/boxcarring/RequestBox.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/boxcarring/RequestBox.java index 0692a9f296..c62fa8b1f1 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/boxcarring/RequestBox.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/boxcarring/RequestBox.java @@ -23,10 +23,14 @@ import javax.xml.stream.XMLStreamException; import org.apache.axiom.om.OMElement; +import org.apache.axis2.context.MessageContext; import org.apache.commons.io.output.NullOutputStream; import org.wso2.micro.integrator.dataservices.core.DBUtils; import org.wso2.micro.integrator.dataservices.core.DataServiceFault; import org.wso2.micro.integrator.dataservices.core.dispatch.DataServiceRequest; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; + +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.MULTI_REQUEST_LAST_INDEX_PROPERTY; /** * Represents a boxcarring session service request group. @@ -56,13 +60,16 @@ public void clear() { * and the stored requests will be executed, * the result of the last operation is returned. */ - public synchronized OMElement execute() throws DataServiceFault { + public synchronized OMElement execute(MessageContext messageContext) throws DataServiceFault { OMElement result; List reqList = this.getRequests(); int n = reqList.size(); OMElement resultElement = null; for (int i = 0; i < n; i++) { - result = reqList.get(i).dispatch(); + DataServicesTracingCollector.reportMultiEvent(messageContext, i, reqList.get(i)); + messageContext.setProperty(MULTI_REQUEST_LAST_INDEX_PROPERTY, i); + result = reqList.get(i).dispatch(messageContext); + DataServicesTracingCollector.closerMultiEvent(messageContext, i, result); if (result != null) { try { /* if it's the last request, return the result, diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BatchDataServiceRequest.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BatchDataServiceRequest.java index 821f7ba7e0..f57ca1a1fd 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BatchDataServiceRequest.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BatchDataServiceRequest.java @@ -22,10 +22,14 @@ import java.util.Map; import org.apache.axiom.om.OMElement; +import org.apache.axis2.context.MessageContext; import org.wso2.micro.integrator.dataservices.core.DataServiceFault; import org.wso2.micro.integrator.dataservices.core.TLConnectionStore; import org.wso2.micro.integrator.dataservices.core.engine.DataService; import org.wso2.micro.integrator.dataservices.core.engine.ParamValue; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; + +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.MULTI_REQUEST_LAST_INDEX_PROPERTY; /** * Represents a batch data service request. @@ -85,10 +89,10 @@ public List getDSRequests() { } /** - * @see DataServiceRequest#processRequest() + * @see DataServiceRequest#processRequest(MessageContext messageContext) */ @Override - public OMElement processRequest() throws DataServiceFault { + public OMElement processRequest(MessageContext messageContext) throws DataServiceFault { boolean error = true; try { /* signal that we are batch processing */ @@ -103,7 +107,10 @@ public OMElement processRequest() throws DataServiceFault { /* set the current batch request number in TL */ DispatchStatus.setBatchRequestNumber(i); /* execute/enqueue request */ - OMElement element = requests.get(i).dispatch(); + DataServicesTracingCollector.reportMultiEvent(messageContext, i, requests.get(i)); + messageContext.setProperty(MULTI_REQUEST_LAST_INDEX_PROPERTY, i); + OMElement element = requests.get(i).dispatch(messageContext); + DataServicesTracingCollector.closerMultiEvent(messageContext, i, element); if (element != null && element.getFirstOMChild() != null) { result = element; } diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BoxcarringDataServiceRequest.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BoxcarringDataServiceRequest.java index 046a283615..2668b74c77 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BoxcarringDataServiceRequest.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/BoxcarringDataServiceRequest.java @@ -21,6 +21,7 @@ import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; +import org.apache.axis2.context.MessageContext; import org.wso2.micro.integrator.dataservices.common.DBConstants.BoxcarringOps; import org.wso2.micro.integrator.dataservices.core.DBUtils; import org.wso2.micro.integrator.dataservices.core.DSSessionManager; @@ -48,10 +49,10 @@ public DataServiceRequest getDSRequest() { } /** - * @see DataServiceRequest#processRequest() + * @see DataServiceRequest#processRequest(MessageContext messageContext) */ @Override - public OMElement processRequest() throws DataServiceFault { + public OMElement processRequest(MessageContext messageContext) throws DataServiceFault { if (BoxcarringOps.BEGIN_BOXCAR.equals(this.getRequestName())) { /* clear earlier boxcarring sessions */ DSSessionManager.getCurrentRequestBox().clear(); @@ -65,7 +66,7 @@ public OMElement processRequest() throws DataServiceFault { if (!this.getDataService().isInDTX()) { this.getDataService().getDSSTxManager().begin(); } - OMElement lastRequestResult = DSSessionManager.getCurrentRequestBox().execute(); + OMElement lastRequestResult = DSSessionManager.getCurrentRequestBox().execute(messageContext); error = false; return lastRequestResult; } finally { diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/DataServiceRequest.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/DataServiceRequest.java index 6daf2b88f5..9124ffccd5 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/DataServiceRequest.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/DataServiceRequest.java @@ -299,7 +299,8 @@ private static List> getBatchInputValuesFromOM( */ @SuppressWarnings("unchecked") private static DataServiceRequest createRequestBoxRequest(DataService dataService, String requestName, - OMElement inputMessage) throws DataServiceFault { + OMElement inputMessage) + throws DataServiceFault { RequestBoxRequest dsRequest = new RequestBoxRequest(dataService, requestName); if (inputMessage == null) { @@ -352,11 +353,11 @@ public String[] getUserRoles() { /** * Dispatches the current request. This method does common dispatching logic and call the - * request type specific {@link DataServiceRequest}{@link #processRequest()} method. + * request type specific {@link DataServiceRequest}{@link #processRequest(MessageContext messageContext)} method. * @return The result of the request invocation * @throws DataServiceFault */ - public OMElement dispatch() throws DataServiceFault { + public OMElement dispatch(MessageContext messageContext) throws DataServiceFault { /* set user */ if (this.getUserRoles() != null) { DataServiceUser currentUser = new DataServiceUser(this.getUser(), @@ -365,7 +366,7 @@ public OMElement dispatch() throws DataServiceFault { } /* request specific processing */ - OMElement result = this.processRequest(); + OMElement result = this.processRequest(messageContext); /* check disable streaming */ if (this.isDisableStreaming()) { /* if result is of type OMSourcedElementImpl, that means, @@ -376,12 +377,22 @@ public OMElement dispatch() throws DataServiceFault { } return result; } + + /** + * Dispatches the current request. + * + * @return The result of the request invocation + * @throws DataServiceFault + */ + public OMElement dispatch() throws DataServiceFault { + return dispatch(null); + } /** * This method must implement the request specific request processing logic. + * @param messageContext Axis2 message context of the request * @return The result of the request invocation * @throws DataServiceFault - */ - public abstract OMElement processRequest() throws DataServiceFault; - + */ + public abstract OMElement processRequest(MessageContext messageContext) throws DataServiceFault; } diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/RequestBoxRequest.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/RequestBoxRequest.java index b77aac4081..81d0bdab4c 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/RequestBoxRequest.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/RequestBoxRequest.java @@ -18,11 +18,13 @@ package org.wso2.micro.integrator.dataservices.core.dispatch; import org.apache.axiom.om.OMElement; +import org.apache.axis2.context.MessageContext; import org.wso2.micro.integrator.dataservices.core.DataServiceFault; import org.wso2.micro.integrator.dataservices.core.TLConnectionStore; import org.wso2.micro.integrator.dataservices.core.boxcarring.RequestBox; import org.wso2.micro.integrator.dataservices.core.boxcarring.TLParamStore; import org.wso2.micro.integrator.dataservices.core.engine.DataService; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; /** * Request box data service request for request grouping. @@ -54,10 +56,10 @@ public void addRequests(DataServiceRequest request) { } /** - * @see DataServiceRequest#processRequest() + * @see DataServiceRequest#processRequest(MessageContext messageContext) */ @Override - public OMElement processRequest() throws DataServiceFault { + public OMElement processRequest(MessageContext messageContext) throws DataServiceFault { boolean error = true; try { @@ -65,7 +67,7 @@ public OMElement processRequest() throws DataServiceFault { if (!this.getDataService().isInDTX()) { this.getDataService().getDSSTxManager().begin(); } - OMElement lastRequestResult = this.requestBox.execute(); + OMElement lastRequestResult = this.requestBox.execute(messageContext); error = false; return lastRequestResult; } finally { diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/SingleDataServiceRequest.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/SingleDataServiceRequest.java index 3db4c05b1d..4328d77785 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/SingleDataServiceRequest.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/dispatch/SingleDataServiceRequest.java @@ -24,6 +24,7 @@ import org.apache.axiom.om.OMElement; import org.apache.axiom.om.impl.llom.OMSourcedElementImpl; +import org.apache.axis2.context.MessageContext; import org.wso2.micro.integrator.dataservices.core.DBUtils; import org.wso2.micro.integrator.dataservices.core.DataServiceFault; import org.wso2.micro.integrator.dataservices.core.XSLTTransformer; @@ -55,10 +56,10 @@ public Map getParams() { } /** - * @see DataServiceRequest#processRequest() + * @see DataServiceRequest#processRequest(MessageContext messageContext) */ @Override - public OMElement processRequest() throws DataServiceFault { + public OMElement processRequest(MessageContext messageContext) throws DataServiceFault { try { Query.resetQueryPreprocessing(); Query.setQueryPreprocessingInitial(true); diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/opentelemetry/DataServicesTracingCollector.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/opentelemetry/DataServicesTracingCollector.java new file mode 100644 index 0000000000..1d9b1f20b5 --- /dev/null +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/opentelemetry/DataServicesTracingCollector.java @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2025, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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 org.wso2.micro.integrator.dataservices.core.opentelemetry; + +import org.apache.axiom.om.OMElement; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.synapse.aspects.flow.statistics.collectors.RuntimeStatisticCollector; +import org.apache.synapse.aspects.flow.statistics.data.raw.StatisticDataUnit; +import org.apache.synapse.aspects.flow.statistics.tracing.opentelemetry.OpenTelemetryManagerHolder; +import org.wso2.micro.integrator.dataservices.common.DBConstants; +import org.wso2.micro.integrator.dataservices.core.DataServiceFault; +import org.wso2.micro.integrator.dataservices.core.description.query.Query; +import org.wso2.micro.integrator.dataservices.core.dispatch.DataServiceRequest; +import org.wso2.micro.integrator.dataservices.core.engine.CallQuery; +import org.wso2.micro.integrator.dataservices.core.engine.DataService; + +import java.util.HashMap; +import java.util.Map; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_SERVICE_INDEX; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_QUERY_EXECUTION_INDEX; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DB_CONFIG_ID; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DB_QUERY_ID; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DEFAULT_ODATA_SERVICE_NAME; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DEFAULT_PARENT_INDEX; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.HTTP_METHOD; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.HTTP_METHOD_OBJECT; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.HTTP_URL; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.ODATA_SERVICE; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.MULTI_REQUEST_BASE_INDEX; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.MULTI_REQUEST_LAST_INDEX_PROPERTY; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.TRANSPORT_IN_URL; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.URL_SEPARATOR; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.URL_SEPARATOR_CHAR; + +/** + * DataServicesTracingCollector receives statistic events and responsible for handling each of these events. + */ +public class DataServicesTracingCollector extends RuntimeStatisticCollector { + private static final Log log = LogFactory.getLog(DataServicesTracingCollector.class); + + /** + * Report entry event for data service invocation. + * @param messageContext Axis2 message context + */ + public static void reportEntryEvent(MessageContext messageContext) { + if (isOpenTelemetryEnabled() && messageContext != null) { + String componentName = messageContext.getAxisService().getName(); + Map customProperties = getHTTPProperties(messageContext); + setStatisticsTraceId(messageContext); + + StatisticDataUnit statisticDataUnit = new StatisticDataUnit(); + statisticDataUnit.setComponentName(componentName); + statisticDataUnit.setComponentId("DataService:" + componentName); + statisticDataUnit.setOuterLayerSpan(true); + statisticDataUnit.setCurrentIndex(DATA_SERVICE_INDEX); + statisticDataUnit.setParentIndex(DEFAULT_PARENT_INDEX); + statisticDataUnit.setComponentTypeString("DataService"); + statisticDataUnit.setTime(System.currentTimeMillis()); + statisticDataUnit.setCustomProperties(customProperties); + + setPayload(messageContext.getEnvelope(), statisticDataUnit); + + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler() + .handleOpenEntryEvent(statisticDataUnit, messageContext); + } + } + + /** + * Close entry event for data service invocation. + * + * @param messageContext Axis2 message context + * @param result Payload OMElement result payload + */ + public static void closeEntryEvent(MessageContext messageContext, OMElement result) { + handleCloseEvents(messageContext, result, DATA_SERVICE_INDEX); + } + + /** + * Report query execution event for data service invocation. + * + * @param messageContext Axis2 message context + * @param request Data service request + */ + public static void reportQueryExecutionEvent(MessageContext messageContext, DataServiceRequest request) { + if (isOpenTelemetryEnabled() && messageContext != null) { + AxisService axisService = messageContext.getAxisService(); + String componentName = axisService.getName(); + Map customProperties = getDataServiceProperties(request); + + StatisticDataUnit statisticDataUnit = new StatisticDataUnit(); + statisticDataUnit.setComponentName(componentName); + statisticDataUnit.setComponentId("QueryExecution:" + componentName); + statisticDataUnit.setComponentTypeString("QueryExecution"); + statisticDataUnit.setParentIndex(DATA_SERVICE_INDEX); + statisticDataUnit.setCurrentIndex(DATA_QUERY_EXECUTION_INDEX); + statisticDataUnit.setTime(System.currentTimeMillis()); + statisticDataUnit.setCustomProperties(customProperties); + setPayload(messageContext.getEnvelope(), statisticDataUnit); + + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler(). + handleOpenEntryEvent(statisticDataUnit, messageContext); + } + } + + /** + * Close query execution event for data service invocation. + * + * @param messageContext Axis2 message context + * @param result Payload OMElement result payload + */ + public static void closeQueryExecutionEvent(MessageContext messageContext, OMElement result) { + handleCloseEvents(messageContext, result, DATA_QUERY_EXECUTION_INDEX); + } + + /** + * Report entry event for OData data service invocation. + * + * @param messageContext Axis2 message context + */ + public static void reportOdataEntryEvent(MessageContext messageContext) { + if (isOpenTelemetryEnabled() && messageContext != null) { + String[] serviceDetails = getOdataServiceDetails(messageContext); + String componentName = serviceDetails[0]; + String configID = serviceDetails[1]; + Map customProperties = getHTTPProperties(messageContext); + if (configID != null) { + customProperties.put(DB_CONFIG_ID, configID); + } + setStatisticsTraceId(messageContext); + + StatisticDataUnit statisticDataUnit = new StatisticDataUnit(); + statisticDataUnit.setComponentName(componentName); + statisticDataUnit.setComponentId("DataService:" + componentName); + statisticDataUnit.setComponentTypeString("DataService"); + statisticDataUnit.setOuterLayerSpan(true); + statisticDataUnit.setCurrentIndex(DATA_SERVICE_INDEX); + statisticDataUnit.setParentIndex(DEFAULT_PARENT_INDEX); + statisticDataUnit.setTime(System.currentTimeMillis()); + statisticDataUnit.setCustomProperties(customProperties); + + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler() + .handleOpenEntryEvent(statisticDataUnit, messageContext); + } + } + + /** + * Close entry event for OData data service invocation. + * + * @param messageContext Axis2 message context + * @param result Payload OMElement result payload + */ + public static void closeOdataEntryEvent(MessageContext messageContext, OMElement result) { + handleCloseEvents(messageContext, result, DATA_SERVICE_INDEX); + } + + /** + * Report query execution event for OData data service invocation. + * + * @param messageContext Axis2 message context + */ + public static void reportOdataQueryExecutionEvent(MessageContext messageContext) { + if (isOpenTelemetryEnabled() && messageContext != null) { + String[] serviceDetails = getOdataServiceDetails(messageContext); + String componentName = serviceDetails[0]; + String configID = serviceDetails[1]; + Map customProperties = new HashMap<>(); + if (configID != null) { + customProperties.put(DB_CONFIG_ID, configID); + } + + StatisticDataUnit statisticDataUnit = new StatisticDataUnit(); + statisticDataUnit.setComponentName(componentName); + statisticDataUnit.setComponentId("QueryExecution:" + componentName); + statisticDataUnit.setComponentTypeString("QueryExecution"); + statisticDataUnit.setParentIndex(DATA_SERVICE_INDEX); + statisticDataUnit.setCurrentIndex(DATA_QUERY_EXECUTION_INDEX); + statisticDataUnit.setTime(System.currentTimeMillis()); + statisticDataUnit.setCustomProperties(customProperties); + + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler(). + handleOpenEntryEvent(statisticDataUnit, messageContext); + } + } + + /** + * Close query execution event for OData data service invocation. + * + * @param messageContext Axis2 message context + */ + public static void closeOdataQueryExecutionEvent(MessageContext messageContext) { + handleCloseEvents(messageContext, null, DATA_QUERY_EXECUTION_INDEX); + } + + /** + * Report entry event for request box or batch data service invocation. + * + * @param messageContext Axis2 message context + * @param currentIndex Current index of the request in the request box + * @param request Data service request + */ + public static void reportMultiEvent(MessageContext messageContext, int currentIndex, + DataServiceRequest request) { + if (isOpenTelemetryEnabled() && messageContext != null) { + AxisService axisService = messageContext.getAxisService(); + String componentName = axisService.getName(); + Map customProperties = getDataServiceProperties(request); + Object queryId = customProperties.get(DB_QUERY_ID); + String componentId = "RequestBox:" + componentName; + if (queryId != null) { + componentId = componentId + ":" + queryId; + } + + StatisticDataUnit statisticDataUnit = new StatisticDataUnit(); + statisticDataUnit.setComponentName(componentName); + statisticDataUnit.setComponentId(componentId); + statisticDataUnit.setComponentTypeString("QueryExecution"); + statisticDataUnit.setCurrentIndex(currentIndex + MULTI_REQUEST_BASE_INDEX); + statisticDataUnit.setParentIndex(DATA_QUERY_EXECUTION_INDEX); + statisticDataUnit.setTime(System.currentTimeMillis()); + statisticDataUnit.setCustomProperties(customProperties); + setPayload(messageContext.getEnvelope(), statisticDataUnit); + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler(). + handleOpenEntryEvent(statisticDataUnit, messageContext); + } + } + + /** + * Close entry event for request box or batch data service invocation. + * + * @param messageContext Axis2 message context + * @param currentIndex Current index of the request in the request box + * @param result Payload OMElement result payload + */ + public static void closerMultiEvent(MessageContext messageContext, int currentIndex, OMElement result) { + handleCloseEvents(messageContext, result, currentIndex + MULTI_REQUEST_BASE_INDEX); + } + + /** + * Close flow forcefully event for data service invocation. + * + * @param messageContext Axis2 message context + * @param currentIndex Current index of the request in the request box + * @param e Exception occurred + */ + public static void closeFlowForcefully(MessageContext messageContext, int currentIndex, Exception e) { + if (isOpenTelemetryEnabled() && messageContext != null) { + + // Adjust current index for multi requests (request box or batch requests) + Object lastIndexObj = messageContext.getProperty(MULTI_REQUEST_LAST_INDEX_PROPERTY); + if (lastIndexObj instanceof Integer) { + currentIndex = (Integer) lastIndexObj + MULTI_REQUEST_BASE_INDEX; + } + + StatisticDataUnit dataUnit = new StatisticDataUnit(); + dataUnit.setTime(System.currentTimeMillis()); + dataUnit.setCurrentIndex(currentIndex); + if (e instanceof DataServiceFault) { + DataServiceFault dataServiceFault = (DataServiceFault) e; + dataUnit.setErrorCode(dataServiceFault.getCode()); + dataUnit.setErrorMessage(dataServiceFault.getMessage()); + } else { + dataUnit.setErrorCode(DBConstants.FaultCodes.UNKNOWN_ERROR); + dataUnit.setErrorMessage(e.getMessage()); + } + + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler() + .handleCloseFlowForcefully(dataUnit, messageContext); + } + } + + private static void handleCloseEvents(MessageContext messageContext, OMElement result, int dataServiceIndex) { + if (isOpenTelemetryEnabled() && messageContext != null) { + StatisticDataUnit statisticDataUnit = new StatisticDataUnit(); + statisticDataUnit.setCurrentIndex(dataServiceIndex); + statisticDataUnit.setTime(System.currentTimeMillis()); + setPayload(result, statisticDataUnit); + + OpenTelemetryManagerHolder.getOpenTelemetryManager().getHandler(). + handleCloseEntryEvent(statisticDataUnit, messageContext); + } + } + + private static String[] getOdataServiceDetails(MessageContext messageContext) { + String odataServiceName; + String odataServiceUri; + String configID; + Object transportInURL = messageContext.getProperty(TRANSPORT_IN_URL); + String uri = transportInURL != null ? transportInURL.toString() : ""; + int index = uri.indexOf(ODATA_SERVICE); + if (-1 != index) { + int serviceStart = index + ODATA_SERVICE.length(); + if (uri.length() > serviceStart + 1) { + odataServiceUri = uri.substring(serviceStart); + if (-1 != odataServiceUri.indexOf(URL_SEPARATOR_CHAR)) { + String[] params = odataServiceUri.split(URL_SEPARATOR); + odataServiceName = params[0]; + configID = params[1]; + return new String[] {odataServiceName, configID}; + } + } + } + return new String[] {DEFAULT_ODATA_SERVICE_NAME, null}; + } + + private static Map getHTTPProperties(MessageContext messageContext) { + String method = (String) messageContext.getProperty(HTTP_METHOD_OBJECT); + String address = messageContext.getTo() != null ? messageContext.getTo().getAddress() : null; + Map customProperties = new HashMap<>(); + if (method != null) { + customProperties.put(HTTP_METHOD, method); + } + if (address != null) { + customProperties.put(HTTP_URL, address); + } + return customProperties; + } + + private static Map getDataServiceProperties(DataServiceRequest request) { + DataService dataService = request.getDataService(); + String requestName = request.getRequestName(); + CallQuery callQuery = dataService.getCallableRequest(requestName).getCallQuery(); + Map customProperties = new HashMap<>(); + if (callQuery != null) { + Query query = callQuery.getQuery(); + String queryId = query.getQueryId(); + String configId = query.getConfigId(); + if (queryId != null) { + customProperties.put(DB_QUERY_ID, queryId); + } + if (configId != null) { + customProperties.put(DB_CONFIG_ID, configId); + } + } + return customProperties; + } + + private static void setPayload(OMElement payload, StatisticDataUnit dataUnit) { + try { + if (payload != null) { + dataUnit.setPayload(payload.toString()); + } + } catch (Exception e) { + // We are catching exception to avoid any issues with toString() and + // We should not fail the main flow due to tracing issues + log.error("Error while setting payload for tracing span", e); + dataUnit.setPayload("Bad Payload"); + dataUnit.setErrorMessage("Error while setting payload for tracing span"); + dataUnit.setErrorCode(DBConstants.FaultCodes.UNKNOWN_ERROR); + } + } +} diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/opentelemetry/DataServicesTracingConstants.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/opentelemetry/DataServicesTracingConstants.java new file mode 100644 index 0000000000..3e5bfcc370 --- /dev/null +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/opentelemetry/DataServicesTracingConstants.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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 org.wso2.micro.integrator.dataservices.core.opentelemetry; + +public class DataServicesTracingConstants { + public static final int DEFAULT_PARENT_INDEX = -1; + public static final int DATA_SERVICE_INDEX = 0; + public static final int DATA_QUERY_EXECUTION_INDEX = 1; + public static final int MULTI_REQUEST_BASE_INDEX = 2; + public static final String MULTI_REQUEST_LAST_INDEX_PROPERTY = "MULTI_REQUEST_LAST_INDEX_PROPERTY"; + public static final String ODATA_SERVICE = "odata/"; + public static final String URL_SEPARATOR = "/"; + public static final Character URL_SEPARATOR_CHAR = '/'; + public static final String TRANSPORT_IN_URL = "TransportInURL"; + public static final String HTTP_METHOD = "http.method"; + public static final String HTTP_URL = "http.url"; + public static final String HTTP_METHOD_OBJECT = "HTTP_METHOD_OBJECT"; + public static final String DB_CONFIG_ID = "db.config.id"; + public static final String DB_QUERY_ID = "db.query.id"; + public static final String DEFAULT_ODATA_SERVICE_NAME = "default_odata_service_name"; +} diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataEndpoint.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataEndpoint.java index 3b8c88ba8e..086366e4ca 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataEndpoint.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataEndpoint.java @@ -25,6 +25,9 @@ import org.wso2.micro.integrator.dataservices.core.odata.ODataServiceFault; import org.wso2.micro.integrator.dataservices.core.odata.ODataServiceHandler; import org.wso2.micro.integrator.dataservices.core.odata.ODataServiceRegistry; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; + +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_QUERY_EXECUTION_INDEX; public class ODataEndpoint { private static final Log log = LogFactory.getLog(ODataEndpoint.class); @@ -101,11 +104,15 @@ private static void process(ODataServletRequest request, ODataServletResponse re } else { Thread streamThread = new Thread(() -> { try { + DataServicesTracingCollector.reportOdataQueryExecutionEvent(request.getAxis2MessageContext()); oDataServiceHandler.process(request, response, serviceRootPath); + DataServicesTracingCollector.closeOdataQueryExecutionEvent(request.getAxis2MessageContext()); } catch (Exception e) { if (log.isDebugEnabled()) { log.debug("Failed to process the servlet request. " + e); } + DataServicesTracingCollector.closeFlowForcefully(request.getAxis2MessageContext(), + DATA_QUERY_EXECUTION_INDEX, e); throw new SynapseException("Error occurred while processing the request " + request + ".", e); } finally { response.flushOutputStream(); @@ -121,7 +128,7 @@ private static void process(ODataServletRequest request, ODataServletResponse re * @param uri Request uri * @return String Array String[0] ServiceName, String[1] ConfigID */ - private static String[] getServiceDetails(String uri) throws ODataServiceFault { + public static String[] getServiceDetails(String uri) throws ODataServiceFault { String odataServiceName; String odataServiceUri; String configID; diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataPassThroughHandler.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataPassThroughHandler.java index 47456d3969..29b6321d4c 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataPassThroughHandler.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataPassThroughHandler.java @@ -25,13 +25,17 @@ import org.apache.commons.logging.LogFactory; import org.apache.synapse.AbstractSynapseHandler; import org.apache.synapse.MessageContext; +import org.apache.synapse.SynapseConstants; import org.apache.synapse.SynapseException; import org.apache.synapse.core.axis2.Axis2MessageContext; import org.apache.synapse.transport.passthru.PassThroughConstants; import org.apache.synapse.transport.passthru.util.RelayUtils; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; import javax.xml.stream.XMLStreamException; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_SERVICE_INDEX; + public class ODataPassThroughHandler extends AbstractSynapseHandler { private static final Log LOG = LogFactory.getLog(ODataPassThroughHandler.class); @@ -46,6 +50,11 @@ public boolean handleRequestInFlow(MessageContext messageContext) { Object isODataService = axis2MessageContext.getProperty(IS_ODATA_SERVICE); // In this if block we are skipping proxy services, inbound related message contexts & api. if (axis2MessageContext.getProperty(TRANSPORT_IN_URL) != null && isODataService != null) { + // Marking the message to skip the main sequence in Synapse Axis2 Environment. + messageContext.setProperty(SynapseConstants.SKIP_MAIN_SEQUENCE, Boolean.TRUE); + + DataServicesTracingCollector.reportOdataEntryEvent(axis2MessageContext); + RelayUtils.buildMessage(axis2MessageContext); ODataServletRequest request = new ODataServletRequest(axis2MessageContext); ODataServletResponse response = new ODataServletResponse(axis2MessageContext); @@ -53,9 +62,13 @@ public boolean handleRequestInFlow(MessageContext messageContext) { ODataEndpoint.process(request, response); streamResponseBack(response, messageContext, axis2MessageContext); } + DataServicesTracingCollector.closeOdataEntryEvent(axis2MessageContext, + axis2MessageContext.getEnvelope()); } return true; } catch (Exception e) { + DataServicesTracingCollector.closeFlowForcefully( + ((Axis2MessageContext) messageContext).getAxis2MessageContext(), DATA_SERVICE_INDEX, e); this.handleException("Error occurred in integrator handler.", e, messageContext); return true; } diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataServletRequest.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataServletRequest.java index 2bb909655a..f1aec5bfff 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataServletRequest.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.odata.endpoint/src/main/java/org/wso2/micro/integrator/dataservices/odata/endpoint/ODataServletRequest.java @@ -441,4 +441,9 @@ public AsyncContext getAsyncContext() { public DispatcherType getDispatcherType() { throw new UnsupportedOperationException(); } + + public MessageContext getAxis2MessageContext() { + return axis2MessageContext; + } + } diff --git a/components/mediation/mediators/dataservices-mediator/org.wso2.micro.integrator.mediator.dataservice/src/main/java/org/wso2/micro/integrator/mediator/dataservice/DataServiceCallMediator.java b/components/mediation/mediators/dataservices-mediator/org.wso2.micro.integrator.mediator.dataservice/src/main/java/org/wso2/micro/integrator/mediator/dataservice/DataServiceCallMediator.java index 401b930c32..82ddad0b95 100644 --- a/components/mediation/mediators/dataservices-mediator/org.wso2.micro.integrator.mediator.dataservice/src/main/java/org/wso2/micro/integrator/mediator/dataservice/DataServiceCallMediator.java +++ b/components/mediation/mediators/dataservices-mediator/org.wso2.micro.integrator.mediator.dataservice/src/main/java/org/wso2/micro/integrator/mediator/dataservice/DataServiceCallMediator.java @@ -45,6 +45,7 @@ import org.w3c.dom.Document; import org.wso2.micro.integrator.dataservices.core.DataServiceFault; import org.wso2.micro.integrator.dataservices.core.DataServiceProcessor; +import org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingCollector; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -56,6 +57,7 @@ import java.util.List; import static org.wso2.micro.integrator.dataservices.core.dispatch.DataServiceRequest.AXIS_OPERATION_NAME; +import static org.wso2.micro.integrator.dataservices.core.opentelemetry.DataServicesTracingConstants.DATA_SERVICE_INDEX; public class DataServiceCallMediator extends AbstractMediator { @@ -206,7 +208,9 @@ private void dispatchToService(org.apache.axis2.context.MessageContext axis2Mess MessageContext messageContext, SynapseLog synLog) { try { + DataServicesTracingCollector.reportEntryEvent(axis2MessageContext); OMElement omElement = DataServiceProcessor.dispatch(axis2MessageContext); + DataServicesTracingCollector.closeEntryEvent(axis2MessageContext, omElement); if (synLog.isTraceOrDebugEnabled()) { synLog.traceOrDebug("The result OMElement from the dataservice : " + omElement); } @@ -240,6 +244,7 @@ private void dispatchToService(org.apache.axis2.context.MessageContext axis2Mess axisMsgCtx.setEnvelope(createDefaultSOAPEnvelope(messageContext)); } } catch (DataServiceFault dataServiceFault) { + DataServicesTracingCollector.closeFlowForcefully(axis2MessageContext, DATA_SERVICE_INDEX, dataServiceFault); if (synLog.isTraceOrDebugEnabled()) { synLog.traceOrDebug(dataServiceFault.getMessage()); } diff --git a/distribution/src/resources/config-tool/key-mappings.json b/distribution/src/resources/config-tool/key-mappings.json index 59134ffcc3..ffa46aa3db 100644 --- a/distribution/src/resources/config-tool/key-mappings.json +++ b/distribution/src/resources/config-tool/key-mappings.json @@ -116,6 +116,9 @@ "opentelemetry.url": "synapse_properties.'opentelemetry.url'", "opentelemetry.class": "synapse_properties.'opentelemetry.class'", + "opentelemetry.filtered.mediator.names": "synapse_properties.'oltp.filtered.mediator.names'", + "opentelemetry.custom.span.header.tags": "synapse_properties.'oltp.custom.span.header.tags'", + "transport.http.socket_timeout": "passthru_properties.'http.socket.timeout'", "transport.http.block_service_list": "passthru_properties.'http.block_service_list'", "transport.http.connection_timeout": "passthru_properties.'http.connection.timeout'",