Show performance metrics for long-running ops (#6148)

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2023-03-16 16:53:20 +01:00 committed by GitHub
parent dcad4d3dc4
commit b6beda19f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 266 additions and 22 deletions

View File

@ -40,6 +40,7 @@ CLASS zcl_abapgit_code_inspector DEFINITION
PRIVATE SECTION.
DATA mv_success TYPE abap_bool .
DATA mv_summary TYPE string.
TYPES: ty_run_mode TYPE c LENGTH 1.
@ -333,6 +334,11 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION.
ENDMETHOD.
METHOD zif_abapgit_code_inspector~get_summary.
rv_summary = mv_summary.
ENDMETHOD.
METHOD zif_abapgit_code_inspector~is_successful.
rv_success = mv_success.
@ -344,17 +350,21 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION.
DATA: lo_set TYPE REF TO cl_ci_objectset,
lo_variant TYPE REF TO cl_ci_checkvariant,
lv_count TYPE i,
lo_timer TYPE REF TO zcl_abapgit_timer,
lx_error TYPE REF TO zcx_abapgit_exception.
TRY.
lo_set = create_objectset( ).
IF lines( lo_set->iobjlst-objects ) = 0.
lv_count = lines( lo_set->iobjlst-objects ).
IF lv_count = 0.
" no objects, nothing to check
RETURN.
ENDIF.
lo_timer = zcl_abapgit_timer=>create( iv_count = lv_count )->start( ).
lo_variant = create_variant( iv_variant ).
mo_inspection = create_inspection(
@ -378,5 +388,7 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION.
ENDTRY.
mv_summary = lo_timer->end( ).
ENDMETHOD.
ENDCLASS.

View File

@ -10,7 +10,12 @@ INTERFACE zif_abapgit_code_inspector
VALUE(rt_list) TYPE scit_alvlist
RAISING
zcx_abapgit_exception .
METHODS is_successful
RETURNING
VALUE(rv_success) TYPE abap_bool .
METHODS get_summary
RETURNING
VALUE(rv_summary) TYPE string.
ENDINTERFACE.

View File

@ -613,8 +613,10 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION.
* serializes only objects
DATA: lv_max TYPE i,
lv_count TYPE i,
li_progress TYPE REF TO zif_abapgit_progress,
li_exit TYPE REF TO zif_abapgit_exit,
lo_timer TYPE REF TO zcl_abapgit_timer,
lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
@ -635,7 +637,13 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION.
CHANGING
ct_tadir = lt_tadir ).
li_progress = zcl_abapgit_progress=>get_instance( lines( lt_tadir ) ).
lv_count = lines( lt_tadir ).
li_progress = zcl_abapgit_progress=>get_instance( lv_count ).
lo_timer = zcl_abapgit_timer=>create(
iv_text = 'Serialize:'
iv_count = lv_count )->start( ).
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
@ -653,6 +661,8 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION.
ENDIF.
ENDLOOP.
li_progress->off( ).
WAIT UNTIL mv_free = lv_max UP TO 120 SECONDS.
rt_files = mt_files.
FREE mt_files.
@ -667,5 +677,7 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION.
CHANGING
ct_files = rt_files ).
lo_timer->end( abap_true ).
ENDMETHOD.
ENDCLASS.

View File

@ -196,7 +196,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
CLASS zcl_abapgit_objects IMPLEMENTATION.
METHOD changed_by.
@ -605,6 +605,7 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
lx_exc TYPE REF TO zcx_abapgit_exception.
DATA lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
DATA ls_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params.
DATA lo_timer TYPE REF TO zcl_abapgit_timer.
FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result,
<lv_step_id> TYPE LINE OF zif_abapgit_definitions=>ty_deserialization_step_tt,
@ -642,6 +643,10 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
lt_items = map_results_to_items( lt_results ).
lo_timer = zcl_abapgit_timer=>create(
iv_text = 'Deserialize:'
iv_count = lines( lt_items ) )->start( ).
check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_main_language( )
it_items = lt_items ).
@ -774,6 +779,8 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
zcl_abapgit_default_transport=>get_instance( )->reset( ).
lo_timer->end( abap_true ).
ENDMETHOD.

View File

@ -40,8 +40,6 @@ CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
zcx_abapgit_exception .
PRIVATE SECTION.
TYPES: ty_time TYPE p LENGTH 10 DECIMALS 2.
DATA mo_settings TYPE REF TO zcl_abapgit_settings .
DATA mx_error TYPE REF TO zcx_abapgit_exception .
DATA mo_exception_viewer TYPE REF TO zcl_abapgit_exception_viewer .
@ -68,7 +66,7 @@ CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
zcx_abapgit_exception .
METHODS footer
IMPORTING
!iv_time TYPE ty_time
!iv_time TYPE string
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS render_link_hints
@ -100,7 +98,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
CLASS zcl_abapgit_gui_page IMPLEMENTATION.
METHOD constructor.
@ -140,7 +138,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
iv_txt = ri_html->icon( 'git-alt' ) ).
ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-homepage
iv_txt = ri_html->icon( iv_name = 'abapgit'
iv_hint = |{ iv_time } sec| ) ).
iv_hint = iv_time ) ).
ri_html->add( '</div>' ).
ri_html->add( |<div class="version">{ zif_abapgit_version=>c_abap_version }{ lv_version_detail }</div>| ).
ri_html->add( '</td>' ).
@ -387,13 +385,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
DATA:
li_script TYPE REF TO zif_abapgit_html,
lv_start TYPE i,
lv_end TYPE i,
lv_total TYPE ty_time.
lo_timer TYPE REF TO zcl_abapgit_timer.
register_handlers( ).
GET RUN TIME FIELD lv_start.
lo_timer = zcl_abapgit_timer=>create( )->start( ).
" Real page
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
@ -416,10 +412,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
ii_html = ri_html
iv_part_category = c_html_parts-hidden_forms ).
GET RUN TIME FIELD lv_end.
lv_total = ( lv_end - lv_start ) / 1000 / 1000.
ri_html->add( footer( lv_total ) ).
ri_html->add( footer( lo_timer->end( ) ) ).
ri_html->add( '</div>' ).

View File

@ -64,7 +64,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_CODE_INSP IMPLEMENTATION.
CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION.
METHOD ask_user_for_check_variant.
@ -173,7 +173,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_CODE_INSP IMPLEMENTATION.
register_handlers( ).
ri_html->add( render_variant( mv_check_variant ) ).
ri_html->add( render_variant(
iv_variant = mv_check_variant
iv_summary = mv_summary ) ).
IF lines( mt_result ) = 0.
ri_html->add( '<div class="dummydiv success">' ).
@ -199,6 +201,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_CODE_INSP IMPLEMENTATION.
iv_variant = |{ mv_check_variant }|
iv_save = abap_true ).
mv_summary = li_code_inspector->get_summary( ).
DELETE mt_result WHERE kind = 'N'.
ENDMETHOD.

View File

@ -17,10 +17,12 @@ CLASS zcl_abapgit_gui_page_codi_base DEFINITION PUBLIC ABSTRACT INHERITING FROM
END OF c_actions .
DATA mo_repo TYPE REF TO zcl_abapgit_repo .
DATA mt_result TYPE scit_alvlist .
DATA mv_summary TYPE string.
METHODS render_variant
IMPORTING
!iv_variant TYPE sci_chkv
!iv_summary TYPE string
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS render_result
@ -277,7 +279,8 @@ CLASS zcl_abapgit_gui_page_codi_base IMPLEMENTATION.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div class="ci-head">' ).
ri_html->add( |Code inspector check variant: <span class="ci-variant">{ iv_variant }</span>| ).
ri_html->add( |Code inspector check variant <span class="ci-variant">{ iv_variant }</span>|
&& | completed ({ iv_summary })| ).
ri_html->add( `</div>` ).
ENDMETHOD.

View File

@ -37,7 +37,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION.
CLASS zcl_abapgit_gui_page_syntax IMPLEMENTATION.
METHOD build_menu.
@ -66,7 +66,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION.
ri_html->add( '<div class="toc">' ).
ri_html->add( render_variant( c_variant ) ).
ri_html->add( render_variant(
iv_variant = c_variant
iv_summary = mv_summary ) ).
IF lines( mt_result ) = 0.
ri_html->add( '<div class="dummydiv success">' ).
@ -94,6 +96,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION.
mt_result = li_syntax_check->run( 'VERI_' && c_variant ).
ENDTRY.
mv_summary = li_syntax_check->get_summary( ).
ENDMETHOD.

View File

@ -0,0 +1,106 @@
CLASS zcl_abapgit_timer DEFINITION
PUBLIC
FINAL
CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS create
IMPORTING
!iv_text TYPE string OPTIONAL
!iv_count TYPE i OPTIONAL
PREFERRED PARAMETER iv_text
RETURNING
VALUE(ro_timer) TYPE REF TO zcl_abapgit_timer.
METHODS constructor
IMPORTING
!iv_text TYPE string OPTIONAL
!iv_count TYPE i OPTIONAL.
METHODS start
RETURNING
VALUE(ro_timer) TYPE REF TO zcl_abapgit_timer.
METHODS end
IMPORTING
!iv_output_as_status_message TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rv_result) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mv_text TYPE string.
DATA mv_count TYPE i.
DATA mv_timer TYPE timestampl.
ENDCLASS.
CLASS zcl_abapgit_timer IMPLEMENTATION.
METHOD constructor.
mv_text = iv_text.
mv_count = iv_count.
ENDMETHOD.
METHOD create.
CREATE OBJECT ro_timer
EXPORTING
iv_text = iv_text
iv_count = iv_count.
ENDMETHOD.
METHOD end.
DATA:
lv_timestamp TYPE timestampl,
lv_runtime TYPE timestampl,
lv_sec TYPE p LENGTH 11 DECIMALS 2.
IF mv_timer IS INITIAL.
rv_result = 'Runtime measurement has not been started'.
ELSE.
GET TIME STAMP FIELD lv_timestamp.
TRY.
lv_runtime = cl_abap_tstmp=>subtract(
tstmp1 = lv_timestamp
tstmp2 = mv_timer ).
lv_sec = lv_runtime. " round to 2 decimal places
IF mv_count = 1.
rv_result = |1 object, |.
ELSEIF mv_count > 1.
rv_result = |{ mv_count } objects, |.
ENDIF.
rv_result = rv_result && |{ lv_sec } seconds|.
CATCH cx_parameter_invalid.
rv_result = 'Error getting runtime measurement'.
ENDTRY.
ENDIF.
IF iv_output_as_status_message = abap_true.
MESSAGE s000(oo) WITH mv_text rv_result.
ENDIF.
IF mv_text IS NOT INITIAL.
rv_result = |{ mv_text } { rv_result }|.
ENDIF.
ENDMETHOD.
METHOD start.
GET TIME STAMP FIELD mv_timer.
ro_timer = me.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,81 @@
CLASS ltcl_timer DEFINITION FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
check_result
IMPORTING
iv_result TYPE string
iv_regex TYPE string,
run_timer FOR TESTING,
run_timer_with_count FOR TESTING,
run_timer_with_text FOR TESTING.
ENDCLASS.
CLASS ltcl_timer IMPLEMENTATION.
METHOD check_result.
FIND REGEX iv_regex IN iv_result.
cl_abap_unit_assert=>assert_subrc(
act = sy-subrc
msg = 'Did not return right measurement' ).
ENDMETHOD.
METHOD run_timer.
DATA lo_timer TYPE REF TO zcl_abapgit_timer.
lo_timer = zcl_abapgit_timer=>create( )->start( ).
WAIT UP TO 1 SECONDS.
check_result(
iv_result = lo_timer->end( )
iv_regex = '1.0[0-9] seconds' ).
ENDMETHOD.
METHOD run_timer_with_count.
DATA lo_timer TYPE REF TO zcl_abapgit_timer.
lo_timer = zcl_abapgit_timer=>create( iv_count = 1 )->start( ).
WAIT UP TO 1 SECONDS.
check_result(
iv_result = lo_timer->end( )
iv_regex = '1 object, 1.0[0-9] seconds' ).
lo_timer = zcl_abapgit_timer=>create( iv_count = 1234 )->start( ).
WAIT UP TO 1 SECONDS.
check_result(
iv_result = lo_timer->end( )
iv_regex = '1234 objects, 1.0[0-9] seconds' ).
ENDMETHOD.
METHOD run_timer_with_text.
CONSTANTS lc_total TYPE string VALUE 'Total:'.
DATA lo_timer TYPE REF TO zcl_abapgit_timer.
lo_timer = zcl_abapgit_timer=>create( lc_total )->start( ).
WAIT UP TO 1 SECONDS.
check_result(
iv_result = lo_timer->end( )
iv_regex = |{ lc_total } 1.0[0-9] seconds| ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_TIMER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Timer</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>