Product Information
Monitoring Synchronous Outbound messages with SAP Application Interface Framework
Since the release of OnPremise1809, SAP Application Interface Framework is better integrated into Proxy/Webservice technology which makes it now possible to easier monitor synchronous message within one interface.
This blog post describes how to set up an SAP Application Interface Framework interface to monitor Synchronous outbound Web Service or PI messages.
The main step is create a local Metadata Repository data type with same component of INPUT/OUTPUT in consumer proxy.
How does it work?
-
Generate synchronous proxy service
Generate the inbound / outbound service proxy/web service interface
-
Check Message Type in Proxy
Check the message type of proxy input/output parameters
-
Define Metadata Repository namespace
Define MDR namespace for creating local data type
-
Create Metadata Repository Date Type for Output Message Type
Create local data type with same structure of output message type
-
Create Metadata Respository Date Type for Input Message Type
Create local data type with same structure of input message type
-
Create Metadata Respository Data Type for Monitoring
Create local data type embed input / output parameters
-
Create Interface
Create SAP Application Interface Framework interface
-
Create Test Data Report for outbound
Create test data report
-
Generate test data
Create test data.
-
Monitoring in Error Handling
Monitor data in AIF Error handling /AIF/ERR.
Example
This example uses a synchronous PI interface to demonstrate the monitoring of SAP Application Interface Framework.
1.1 Generate synchronous proxy service
Run transaction SPROXY, expand the ‘ESR’ type service consumers,
Select one of synchronous proxy, generate and activate it, for example: OSMultiOperSyn
Generate the corresponding inbound service for testing:
Double click the implementing class ZM111_CL_ISMULTI_OPER_SYN
Select the method ZM111_II_ISMULTI_OPER_SYN~ISMULTI_MATERIAL
Click the ‘Source Code’ button, activate below code
method zm111_ii_ismulti_oper_syn~ismulti_material.
*** **** INSERT IMPLEMENTATION HERE **** ***
* BREAK-POINT.
output-rep_material-matnr = 'Test001'.
output-rep_material-matkt = 'Test Material 0001'.
output-rep_material-message = 'Get Material 00001 Successufully'.
endmethod.
Select the method ZM111_II_ISMULTI_OPER_SYN~ISMULTI_ORDER
Click the ‘Source Code’ button, activate below code
method zm111_ii_ismulti_oper_syn~ismulti_order.
*** **** INSERT IMPLEMENTATION HERE **** ***
*** **** This just an example code
output-rep_sales_order-doc_num = '0059'.
output-rep_sales_order-message = 'Get Sales order 0059 successfully'.
if input-so_create-header-sales_org = '9999'.
output-rep_sales_order-doc_num = '9999'.
endif.
endmethod.
Make sure the class ZM111_CL_ISMULTI_OPER_SYN was activated.
1.2 Check Message Type in consumer Proxy
Double click the outbound proxy
Switch to External view,
Double click the request name ‘Output’,
Get the
Message type Name: reqMatCrd
Namespace: http://www.aif.com
Check the message type: reqMatCrd
Get Global Data Type with Elements:
Name: reqMatCrd_TT
Abap type: ZM111_REQ_MAT_CRD_TT
Namespace: http://www.aif.com
Double click the request name ‘Input’,
Get Message type Name: RepMaterial
Check the message type: RepMaterial
Get Global Data Type with elements:
Name: ResponseMaterial
Abap type: ZM111_RESPONSE_MATERIAL
Namespace: http://www.aif.com
1.3 Define Metadata Repository namespace
Run transaction SPXNGENAPPL,
Create new BACKENDMDR type namespace entry if it does not exist.
For example: http://www.aif.com/MDR/###
1.4 Create MDR Date Type for Output Message Type
Run SPROXY, expand the SWCs-> Local->Namespace:
http://www.aif.com/MDR/M111
Right click on the namespace,
Click the ‘Create New Object’,
Select ‘Data Type’,
Select ‘Backend’,
Input Data type name: MTreqMatCrd _DT
Select package ZAIF_TEST_M111, proper change request and prefix ZM111_
Continue and Complete it
For new Date type MTreqMatCrd_DT, switch to external view:
Right click the external name: MTreqMatCrd_DT,
Select ‘Switch to Complex content type’
Right click the external name: MTreqMatCrd_DT,
Select ‘Add Element’
Input name: reqMatCrd(same to output message type name) and continue,
Right click on ‘reqMatCrd‘
Select ‘Set Global Type Reference’
Select ‘Select Existing Global Type’
Input Namespace: http://www.aif.com
Select the Abap type: ZM111_REQ_MAT_CRD_TT
Activate it.
1.5 Create Metadata Repository Date Type for Input Message Type
Run transaction SPROXY, expand the SWCs-> Local->Namespace:
http://www.aif.com/MDR/M111
Right click on the namespace,
Click the ‘Create New Object’,
Select ‘Data Type’,
Select ‘Backend’,
Input Data type name: MTRepMaterial_DT
Select package ZAIF_TEST_M111, proper change request and prefix ZM111_
Switch to External view,
Right click the external name: MTRepMaterial_DT,
Select ‘Switch to Complex content type’
Right click the external name: MTRepMaterial_DT,
Select ‘Add Element’
Input name: RepMaterial(same to input message type name) and continue,
Right click on ‘RepMaterial‘
Select ‘Set Global Type Reference’
Select ‘Select Existing Global Type’
Input Namespace: http://www.aif.com
Select the Abap type: ResponseMaterial
Activate it.
1.6 Create Metadata Repository Data Type for Monitoring
Run transaction SPROXY, expand the SWCs-> Local->Namespace:
http://www.aif.com/MDR/M111
Right click on the namespace,
Click the ‘Create New Object’,
Select ‘Data Type’,
Select ‘Backend’,
Input Data type name: MaterialMonitor_DT
Select package ZAIF_TEST_M111, proper change request and prefix ZM111_
Continue and complete it.
Switch to External view,
Right click the external name: MaterialMonitor_DT,
Select ‘Switch to Complex content type’
Add ‘INPUT’ and ‘OUTPUT’ elements
Right click on ‘INPUT‘
Select ‘Set Global Type Reference’
Select ‘Select Existing Global Type’
Input Namespace: http://www.aif.com/MDR/M111
Select the Name: MTRepMaterial_DT
Right click on ‘OUTPUT‘
Select ‘Set Global Type Reference’
Select ‘Select Existing Global Type’
Input Namespace: http://www.aif.com/MDR/M111
Select the Name: MTreqMatCrd_DT
Activate it
Generated structure ZM111_MATERIAL_MONITOR_DT.
1.7 Create Interface
Run transaction “/AIF/CUST”, click IMG node “SAP Application Interface Framework” -> “Interface Development-> “Define Interfaces”.
Input the namespace M111_0, then press continue button.
- Namespace: M111_0
- Interface Name: IF_2_2_6
- Interface Version: 1
- Description: Test Synchronous service with response/request data
- Proxy Class Outbound: ZM111_CO_OSMULTI_OPER_SYN
- Proxy Method: OSMULTI_MATERIAL
Press Enter,
The Raw Data Structure and Record type in Raw Structure will appear.
Input
- SAP Data Structure: ZM111_MATERIAL_MONITOR_DT, this is the generated structure.
Save it.
1.8 Create Test Data Report for outbound.
Run SE38 to create test data report Z####_035 by reference below example code ZM111_ERIC_035.
*&---------------------------------------------------------------------*
*& Report ZTEST_ERIC_034
*&
*&---------------------------------------------------------------------*
REPORT ztest_eric_035.
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-005. "'Default Value for Payloads'.
PARAMETERS: pv_matkx TYPE maktx DEFAULT 'Test for Synchronous service',
pv_meins TYPE meins DEFAULT 'G',
pv_mtart TYPE mtart DEFAULT 'A001',
pv_syst TYPE char3 DEFAULT 'XQX'.
SELECTION-SCREEN END OF BLOCK block1.
DATA:
lr_proxy_syn TYPE REF TO zm111_co_osmulti_oper_syn,
ls_input_mat_syn TYPE zm111_rep_material,
ls_material TYPE zm111_req_mat_crd1,
ls_line_material TYPE zm111_req_mat_crd.
DATA tsl TYPE timestampl.
GET TIME STAMP FIELD tsl.
ls_material-req_mat_crd-create_timestamp = tsl .
ls_material-req_mat_crd-matkl = pv_matkx.
ls_line_material-matnr = 'Test Material 1'.
ls_line_material-mbrsh = 'Test'.
ls_line_material-mtart = pv_mtart.
ls_line_material-maktx = pv_matkx.
ls_line_material-meins = pv_meins.
ls_line_material-matkl = pv_matkx.
ls_line_material-ntgew = 10.
ls_line_material-gewei = 'KG'.
ls_line_material-bismt = 'Older Material No.1 '.
ls_line_material-groes = '1.56'.
APPEND ls_line_material TO ls_material-req_mat_crd-req_mat_crd_t .
IF lr_proxy_syn IS INITIAL.
CREATE OBJECT lr_proxy_syn.
ENDIF.
TRY.
CALL METHOD lr_proxy_syn->osmulti_material
EXPORTING
output = ls_material
IMPORTING
input = ls_input_mat_syn.
CATCH cx_ai_system_fault .
ENDTRY.
1.9 Generate test data
In transaction SE38, run the new created program Z####_ 035 and use default parameters like following picture shows.
2 Monitoring in Error Handling
2.1 Monitor for Error Status Message
Run transaction /AIF/ERR, select one of error message and double click the next level of input/output structure node and check payload in the data content view.
[Check Point]: In interface M111_0 / IF_2_2_6 / 1, payload data for request data should be displayed there. And the response data is empty as the message failed with Error status.
Looks like below:
2.2 Monitor for Success Status Message
Run transaction /AIF/ERR, select one of error message and double click the next level of input structure node and check payload in the data content view.
[Check Point]: In interface M111_0 / IF_2_2_6 / 1, payload data for request and response data should be displayed there.
3 Conclusion
With the own created data structure in metadata repository, you can monitor the synchronous service interface in SAP Application Interface Framework now.
Hi Eric,
Nice Blog.
Hi Hema,
External OData service can not be monitored directly, but you can implement some code in your call with 'XML' engine or 'Sync log' engine, then it can be monitored.
AIF provides 'OData application engine' for asynchronous monitor(without restart and cancel) and 'OData integration at runtime' to support restart and cancel of the OData services provided in the system.
Best Regards
Eric
Hi Eric,
If I'm using an external definition instead of a data type on my interface, the ABAP Type gets created by the proxy, so we don't have a specific data type created.
In this case we are not able to assign it on the new data type (step 1.4) using the "Select Existing Global Type" as it only shows the data types that were created on the ESR.
Do you know how can we handle these cases?
Thank you.
Hi Eric,
thank for the detailed blogpost. I can see the synchronous messages in /AIF/ERR transaction but not available in SRT_MONI.
Do you know where to configure it ?
Best wishes,
Ramjee Korada
Dear Ramjee,
By default, synchronous web service cannot be monitored by SRT_MONI.
There is workaround by just for trace, you can check the reply for Monitoring Synchronous Service Consumer calls without PI | SAP Community
or you can send a ticket to component BC-ESI-WS-ABA-MON to get confirmation.
Best Regards
Eric.
Hi Eric,
I have been using the traces for testing during development.
I am looking for an option to log the messages so that I can check complete payload at any time later.
As mentioned in the blog, I can capture the information in AIF/ERR but we have very important / limited information in AIF. We just dont want duplicate whole payload fields into AIF.
I will raise a ticket to SAP.
Best wishes,
Ramjee Korada
Hi Eric,
Thanks for this blog. Would this also be possible for inbound synchronous messages ( e.g. from Ariba ) ?
Peter
Hi Peter,
It depends how you use our monitor to monitor such synchronous messages(with/without our check, value mapping and action).
Option 1: If you just want to monitor such message processing status, then your can use XML engine to monitoring the error log and payload.
Update status and log:
Reference code can be found in class /AIF/CL_ENABLER_XML method TRANSFER_TO_AIF.
Or option 2: if you can want to use more functionalities of our monitoring, then your can refer to code in function module /AIF/SEND_WITH_PROXY.
You can call:
transform_data: lr_file->transform_data or function /AIF/FILE_TRANSFORM_DATA to do mapping,
perform_actions: lr_file->perform_actions or function /AIF/FILE_PERFORM_ACTIONS to execute actions.
appl_engine->persist_message_data to save payload.
Best Regards,
Eric.