The data supplier RSDSUSER allocates memory for the new performance attribute in which the number of users logged on is reported. It then determines the number of users on its own instance and reports this to the monitoring architecture.
*&--------------------------------------------------------------------**& Report RSDSUSER **& **&--------------------------------------------------------------------**& **& **&--------------------------------------------------------------------*REPORT RSDSUSER.* important INCLUDES of CCMS Monitoring InfrastructureINCLUDE RSALEXTI.INCLUDE RSALOLDI.INCLUDE RSALSMI.INCLUDE RSALSMFI.*-- global variables of program --*DATA: MOTID LIKE ALGLOBTID, SELF_MONI_TID LIKE ALGLOBTID, NUSR_TID LIKE ALGLOBTID, AN_ERROR_OCCURED(1) VALUE SPACE, NUMBER_OF_USERS TYPE I.*-- Start of the main program --*START-OF-SELECTION.* get tid for for self-monitoring message log perform create_datasupplier_log_node changing self_moni_tid.* self moni send rt 39 ("gestartet") perform send_selfmon_msc_message using self_moni_tid 039 sy-repid space sy-repid.* Create Monitor attribute for NUmberOfUsers PERFORM CREATE_MA_NBRUSER.* Get number uf users PERFORM GET_NBRUSER.* Report number of users PERFORM REPORT_NBRUSER.* send ok status for self-monitoring single message, if no error occure if an_error_occured is initial.* self moni Send RT 101 ("OK") PERFORM SEND_SELFMON_MSC_MESSAGE USING SELF_MONI_TID 101 SY-REPID SPACE SY-REPID. endif.** end of the main programFORM GET_NBRUSER. DATA: BEGIN OF USER_TBL OCCURS 100. INCLUDE STRUCTURE UINFO. DATA: END OF USER_TBL.** Function call to determine the users logged on to the local instance CALL FUNCTION 'TH_USER_LIST' TABLES LIST = USER_TBL EXCEPTIONS OTHERS = 1. DESCRIBE TABLE USER_TBL LINES NUMBER_OF_USERS.ENDFORM.*-----------------------------------------------**-- CREATE_MA_NBRUSER -----------------------**-----------------------------------------------*FORM CREATE_MA_NBRUSER.* First, get the TID of the parent node R3Services\Dialog* DIALOG_FULLNAME TYPE ALMTNAME_L-ALMTFULLNM VALUE * '\&SY\&INSTANCE_NAME\R3Services\Dialog', call function 'SALI_MT_GET_TID_BY_NAME' exporting MT_FULL_NAME = DIALOG_FULLNAME importing TID = MOTID exceptions unable_to_expand_name = 1 name_not_found = 2 communication_failure = 3 other_problem = 4 others = 5.* If something is wrong, reports the value to the self-monitoring* single message. Then, exits from the program. if sy-subrc <> 0. AN_ERROR_OCCURED = 'X'.* self moni Send RT 34 PERFORM SEND_SELFMON_MSC_MESSAGE USING SELF_MONI_TID 039 DIALOG_FULLNAME SPACE SY-REPID. exit. endif.* Main call to create a new performance attribute CALL FUNCTION 'SALI_PERF_CREATE_ATTACH' EXPORTING PARENT_TID = MOTID* the parent node MTE_NAME = NUSR_NAME* the name of the new attribute node 'R3UsersLoggedIn' MTE_CLASS = NUSR_CLASS_NAME MTE_NUMRANGE = AL_NR_AUTO MTE_SECONDS_TIL_COLLECTINGTOOL = 240* collecting interval MTE_SECONDS_UNTIL_SET_INACTIVE = 900 MTE_F1_HELP_TEXT_MSGID = CCMS_SELFMON_MSGID MTE_F1_HELP_TEXT_MSGNO = 068* describing text PERF_CUSTOMIZING_GROUP = NUSR_CLASS_NAME* PERF_THRESHOLD_DIRECTION = AL_THRESHDIR_ABOVE PERF_THRESHOLD_GREEN_TO_YELLOW = 50 PERF_THRESHOLD_YELLOW_TO_RED = 70 PERF_THRESHOLD_YELLOW_TO_GREEN = 400 PERF_THRESHOLD_RED_TO_YELLOW = 600 PERF_UNIT_TO_DISPLAY = SPACE* PERF_DECIMALS = 0* thresholds* PERF_ALERT_TEXT_MSGID = 'RT' PERF_ALERT_TEXT_MSGNO = 577* alert text TOOL_COLLECTING = 'CCMS_User_Collect'* data collection method definition in RZ21* TOOL_ONALERT =* No auto reaction method TOOL_ANALYZE = 'CCMS_User_Analyse'* analysis method definition in RZ21 IMPORTING NEW_TID = NUSR_TID EXCEPTIONS INVALID_TID = 1 UNABLE_TO_EXPAND_NAME = 2 INVALID_PARAMETERS = 3 COMMUNICATION_FAILURE = 4 OTHER_PROBLEM = 5 WRONG_SEGMENT = 6 INTERNAL_FAILURE_SALS = 7 OTHERS = 8. if sy-subrc <> 0. AN_ERROR_OCCURED = 'X'.* self moni Send RT 31 PERFORM SEND_SELFMON_MSC_MESSAGE USING SELF_MONI_TID 031 NUSR_NAME SPACE SY-REPID. exit. endif.ENDFORM.*&--------------------------------------------------------------------**& Form REPORT_NBRUSER*&--------------------------------------------------------------------** text*---------------------------------------------------------------------** --> p1 text* <-- p2 text*---------------------------------------------------------------------*FORM REPORT_NBRUSER. DATA: REPORTEDBY(16). REPORTEDBY = SY-REPID.* Main call to report number of users logged in call function 'SALI_PERF_REPORT_VALUE' exporting TOTAL_OF_REPORTED_VALUES = NUMBER_OF_USERS* number_of_reported_values = 1 REPORTEDBY = REPORTEDBY changing TID = NUSR_TID exceptions invalid_tid = 1 wrong_typeclass = 2 invalid_parameters = 3 communication_failure = 4 other_problem = 5 others = 6. if sy-subrc <> 0.* self moni Send RT 33 PERFORM SEND_SELFMON_MSC_MESSAGE USING SELF_MONI_TID 033 NUSR_NAME SPACE SY-REPID. an_error_occured = 'X'. endif.ENDFORM. " REPORT_NBRUSER
Explanations for Report RSDSUSER
CALL FUNCTION 'SALI_MT_GET_TID_BY_NAME'
CALL FUNCTION 'SALI_PERF_CREATE_ATTACH'
(there are analogous SALI* calls for the other attribute types)
The TID of the parent node is specified when doing so.
CALL FUNCTION 'SALI_PERF_REPORT_VALUE'
(there are analogous SALI* calls for the other attribute types)
You can also call the function modules SALI_MT_GET_TID_BY_NAME and SALI_PERF_CREATE_ATTACH (or the corresponding call for other attribute types) directly from the coding of your component. In this case, you have created an active data supplier that is not called by the CCMS monitoring infrastructure (and therefore does not appear in the method definitions, or in the assigned methods for the node).
An active data supplier makes sense, for example, if values are only to be reported if certain conditions are fulfilled on the application server (such as the occurrence of an error).
For more information about this example, see the following sections:
Start Page Creating a Data Supplier for the CCMS Alert Monitor