Skip to content

Draft: CI: Profile factory creations and SQL queries via EventProf and FactoryProf

What does this MR do and why?

This is a proof of concept (hence Draft) to investigate which specs create the most factory and run most SQL queries and thus are slow.

Related:

It tracks amount of factory creations and SQL queries in all RSpec tests via test-prof's EventProf as JSON.

Results

Factory prof per factory name

Top factories which take longer than 100 seconds over all per pipeline.

  {
    "fields": [
      {"key": "name", "label": "Name", "sortable": true},
      {"key": "time", "label": "Total runtime", "sortable": true},
      {"key": "count", "label": "Creations", "sortable": true},
      {"key": "time_per_creation", "label": "Time/Creation", "sortable": true},
      {"key": "top_level_time", "label": "Top-level runtime", "sortable": true},
      {"key": "top_level_count", "label": "Top-level creations", "sortable": true}
    ],
    "items": [{"name":"project","time":41962.46,"count":74303,"time_per_creation":0.56,"top_level_time":23607.05,"top_level_count":38057},{"name":"namespace","time":9881.67,"count":67722,"time_per_creation":0.15,"top_level_time":274.76,"top_level_count":1835},{"name":"merge_request","time":8496.81,"count":11823,"time_per_creation":0.72,"top_level_time":7109.29,"top_level_count":10378},{"name":"user","time":5688.53,"count":67600,"time_per_creation":0.08,"top_level_time":4171.43,"top_level_count":46805},{"name":"group","time":4597.75,"count":31210,"time_per_creation":0.15,"top_level_time":3324.16,"top_level_count":21861},{"name":"ci_pipeline","time":3910.02,"count":12578,"time_per_creation":0.31,"top_level_time":690.07,"top_level_count":5042},{"name":"ci_build","time":3207.01,"count":12468,"time_per_creation":0.26,"top_level_time":1871.13,"top_level_count":8746},{"name":"vulnerabilities_finding","time":3077.34,"count":2388,"time_per_creation":1.29,"top_level_time":1082.45,"top_level_count":909},{"name":"vulnerability","time":2899.61,"count":1478,"time_per_creation":1.96,"top_level_time":2516.54,"top_level_count":1184},{"name":"issue","time":2542.94,"count":14854,"time_per_creation":0.17,"top_level_time":1927.11,"top_level_count":12530},{"name":"organization","time":1502.15,"count":132030,"time_per_creation":0.01,"top_level_time":40.42,"top_level_count":3730},{"name":"vulnerabilities_scanner","time":1286.34,"count":3020,"time_per_creation":0.43,"top_level_time":7.9,"top_level_count":121},{"name":"vulnerabilities_identifier","time":1073.1,"count":2467,"time_per_creation":0.43,"top_level_time":50.41,"top_level_count":175},{"name":"epic","time":834.75,"count":3733,"time_per_creation":0.22,"top_level_time":677.82,"top_level_count":3200},{"name":"group_member","time":782.43,"count":3045,"time_per_creation":0.26,"top_level_time":773.37,"top_level_count":3007},{"name":"conan_package","time":743.9,"count":958,"time_per_creation":0.78,"top_level_time":488.37,"top_level_count":461},{"name":"project_member","time":713.43,"count":1317,"time_per_creation":0.54,"top_level_time":689.31,"top_level_count":1272},{"name":"deployment","time":668.44,"count":1534,"time_per_creation":0.44,"top_level_time":582.65,"top_level_count":1257},{"name":"security_orchestration_policy_configuration","time":666.56,"count":1258,"time_per_creation":0.53,"top_level_time":403.97,"top_level_count":962},{"name":"work_item","time":629.09,"count":5777,"time_per_creation":0.11,"top_level_time":288.13,"top_level_count":1571},{"name":"wiki_page","time":590.57,"count":1352,"time_per_creation":0.44,"top_level_time":577.98,"top_level_count":1322},{"name":"environment","time":573.79,"count":2618,"time_per_creation":0.22,"top_level_time":174.97,"top_level_count":2189},{"name":"terraform_state_version","time":570.66,"count":677,"time_per_creation":0.84,"top_level_time":194.0,"top_level_count":310},{"name":"cluster","time":544.6,"count":2331,"time_per_creation":0.23,"top_level_time":425.98,"top_level_count":1009},{"name":"author","time":522.99,"count":7186,"time_per_creation":0.07,"top_level_time":3.74,"top_level_count":43},{"name":"ci_job_artifact","time":505.93,"count":3758,"time_per_creation":0.13,"top_level_time":304.29,"top_level_count":1115},{"name":"geo_node","time":487.3,"count":2072,"time_per_creation":0.24,"top_level_time":483.7,"top_level_count":2059},{"name":"packages_dependency","time":479.11,"count":946,"time_per_creation":0.51,"top_level_time":399.39,"top_level_count":782},{"name":"package","time":461.62,"count":1113,"time_per_creation":0.41,"top_level_time":13.94,"top_level_count":183},{"name":"todo","time":433.32,"count":1454,"time_per_creation":0.3,"top_level_time":433.32,"top_level_count":1454},{"name":"admin","time":431.26,"count":3040,"time_per_creation":0.14,"top_level_time":431.26,"top_level_count":3040},{"name":"personal_access_token","time":429.88,"count":24221,"time_per_creation":0.02,"top_level_time":421.81,"top_level_count":24093},{"name":"note","time":428.83,"count":3001,"time_per_creation":0.14,"top_level_time":358.44,"top_level_count":2878},{"name":"diff_note_on_merge_request","time":389.36,"count":941,"time_per_creation":0.41,"top_level_time":361.62,"top_level_count":905},{"name":"merge_request_with_diffs","time":360.83,"count":458,"time_per_creation":0.79,"top_level_time":360.83,"top_level_count":458},{"name":"external_merge_request_diff","time":357.03,"count":331,"time_per_creation":1.08,"top_level_time":69.44,"top_level_count":60},{"name":"label","time":346.45,"count":3682,"time_per_creation":0.09,"top_level_time":137.64,"top_level_count":3232},{"name":"epic_tree_node","time":342.22,"count":800,"time_per_creation":0.43,"top_level_time":342.22,"top_level_count":800},{"name":"upload","time":312.55,"count":964,"time_per_creation":0.32,"top_level_time":142.46,"top_level_count":627},{"name":"geo_terraform_state_version_registry","time":309.0,"count":283,"time_per_creation":1.09,"top_level_time":309.0,"top_level_count":283},{"name":"container_repository","time":307.52,"count":1281,"time_per_creation":0.24,"top_level_time":149.17,"top_level_count":1004},{"name":"security_finding","time":299.37,"count":552,"time_per_creation":0.54,"top_level_time":124.24,"top_level_count":343},{"name":"ci_pipeline_artifact","time":292.64,"count":515,"time_per_creation":0.57,"top_level_time":118.64,"top_level_count":244},{"name":"namespace_settings","time":292.58,"count":32403,"time_per_creation":0.01,"top_level_time":9.34,"top_level_count":82},{"name":"maven_package","time":289.65,"count":506,"time_per_creation":0.57,"top_level_time":289.65,"top_level_count":506},{"name":"geo_merge_request_diff_registry","time":289.63,"count":283,"time_per_creation":1.02,"top_level_time":289.63,"top_level_count":283},{"name":"package_file","time":287.07,"count":3773,"time_per_creation":0.08,"top_level_time":61.41,"top_level_count":398},{"name":"work_item_type","time":268.92,"count":22688,"time_per_creation":0.01,"top_level_time":0.71,"top_level_count":61},{"name":"personal_snippet","time":258.97,"count":952,"time_per_creation":0.27,"top_level_time":253.8,"top_level_count":929},{"name":"pages_deployment","time":252.0,"count":747,"time_per_creation":0.34,"top_level_time":113.65,"top_level_count":472},{"name":"merge_train_car","time":245.53,"count":126,"time_per_creation":1.95,"top_level_time":245.53,"top_level_count":126},{"name":"terraform_state","time":245.09,"count":508,"time_per_creation":0.48,"top_level_time":82.24,"top_level_count":178},{"name":"scan_result_policy_read","time":242.26,"count":314,"time_per_creation":0.77,"top_level_time":240.31,"top_level_count":312},{"name":"maven_metadatum","time":239.98,"count":520,"time_per_creation":0.46,"top_level_time":0.99,"top_level_count":15},{"name":"project_snippet","time":239.89,"count":1183,"time_per_creation":0.2,"top_level_time":227.94,"top_level_count":936},{"name":"conan_metadatum","time":239.63,"count":479,"time_per_creation":0.5,"top_level_time":0.53,"top_level_count":1},{"name":"security_scan","time":239.49,"count":399,"time_per_creation":0.6,"top_level_time":125.83,"top_level_count":210},{"name":"labeled_issue","time":213.52,"count":1315,"time_per_creation":0.16,"top_level_time":213.52,"top_level_count":1315},{"name":"saml_provider","time":212.22,"count":1152,"time_per_creation":0.18,"top_level_time":193.88,"top_level_count":1054},{"name":"design","time":212.18,"count":1270,"time_per_creation":0.17,"top_level_time":141.29,"top_level_count":991},{"name":"vulnerability_read","time":204.53,"count":173,"time_per_creation":1.18,"top_level_time":168.12,"top_level_count":85},{"name":"list","time":195.86,"count":644,"time_per_creation":0.3,"top_level_time":195.86,"top_level_count":644},{"name":"ci_secure_file","time":195.55,"count":512,"time_per_creation":0.38,"top_level_time":51.54,"top_level_count":240},{"name":"finding_map","time":191.25,"count":159,"time_per_creation":1.2,"top_level_time":191.25,"top_level_count":159},{"name":"epic_board_position","time":190.36,"count":491,"time_per_creation":0.39,"top_level_time":190.36,"top_level_count":491},{"name":"sbom_occurrence","time":187.14,"count":386,"time_per_creation":0.48,"top_level_time":174.67,"top_level_count":368},{"name":"merge_request_diff","time":183.86,"count":203,"time_per_creation":0.91,"top_level_time":183.86,"top_level_count":203},{"name":"npm_package","time":179.65,"count":899,"time_per_creation":0.2,"top_level_time":179.28,"top_level_count":898},{"name":"merge_request_block","time":178.9,"count":162,"time_per_creation":1.1,"top_level_time":169.93,"top_level_count":157},{"name":"cluster_agent","time":178.1,"count":510,"time_per_creation":0.35,"top_level_time":67.85,"top_level_count":271},{"name":"milestone","time":176.7,"count":3127,"time_per_creation":0.06,"top_level_time":161.56,"top_level_count":3073},{"name":"geo_pipeline_artifact_registry","time":176.21,"count":283,"time_per_creation":0.62,"top_level_time":176.21,"top_level_count":283},{"name":"project_empty_repo","time":175.22,"count":317,"time_per_creation":0.55,"top_level_time":153.7,"top_level_count":272},{"name":"geo_upload_registry","time":172.58,"count":337,"time_per_creation":0.51,"top_level_time":172.58,"top_level_count":337},{"name":"project_wiki_repository","time":171.39,"count":346,"time_per_creation":0.5,"top_level_time":30.4,"top_level_count":77},{"name":"namespace_ci_cd_settings","time":170.76,"count":31788,"time_per_creation":0.01,"top_level_time":0.0,"top_level_count":0},{"name":"ci_empty_pipeline","time":168.43,"count":1306,"time_per_creation":0.13,"top_level_time":111.15,"top_level_count":1175},{"name":"workspace","time":167.21,"count":144,"time_per_creation":1.16,"top_level_time":167.21,"top_level_count":144},{"name":"design_management_repository","time":164.68,"count":416,"time_per_creation":0.4,"top_level_time":35.04,"top_level_count":147},{"name":"geo_package_file_registry","time":164.12,"count":320,"time_per_creation":0.51,"top_level_time":164.12,"top_level_count":320},{"name":"geo_container_repository_registry","time":160.85,"count":310,"time_per_creation":0.52,"top_level_time":160.85,"top_level_count":310},{"name":"cluster_platform_kubernetes","time":150.55,"count":761,"time_per_creation":0.2,"top_level_time":26.14,"top_level_count":131},{"name":"protected_branch","time":147.65,"count":1160,"time_per_creation":0.13,"top_level_time":126.86,"top_level_count":1119},{"name":"geo_ci_secure_file_registry","time":145.89,"count":284,"time_per_creation":0.51,"top_level_time":145.89,"top_level_count":284},{"name":"geo_project_wiki_repository_registry","time":144.04,"count":281,"time_per_creation":0.51,"top_level_time":144.04,"top_level_count":281},{"name":"license","time":143.07,"count":15706,"time_per_creation":0.01,"top_level_time":143.07,"top_level_count":15706},{"name":"geo_job_artifact_registry","time":142.79,"count":234,"time_per_creation":0.61,"top_level_time":142.79,"top_level_count":234},{"name":"event","time":140.43,"count":603,"time_per_creation":0.23,"top_level_time":140.43,"top_level_count":603},{"name":"geo_pages_deployment_registry","time":140.1,"count":284,"time_per_creation":0.49,"top_level_time":140.1,"top_level_count":284},{"name":"packages_dependency_link","time":137.59,"count":2458,"time_per_creation":0.06,"top_level_time":137.59,"top_level_count":2458},{"name":"geo_design_management_repository_registry","time":131.52,"count":281,"time_per_creation":0.47,"top_level_time":131.52,"top_level_count":281},{"name":"gpg_key","time":129.83,"count":92,"time_per_creation":1.41,"top_level_time":126.3,"top_level_count":90},{"name":"labeled_merge_request","time":124.98,"count":509,"time_per_creation":0.25,"top_level_time":124.98,"top_level_count":509},{"name":"note_on_issue","time":120.0,"count":737,"time_per_creation":0.16,"top_level_time":120.0,"top_level_count":737},{"name":"generic_commit_status","time":118.26,"count":360,"time_per_creation":0.33,"top_level_time":118.26,"top_level_count":360},{"name":"geo_project_repository_registry","time":114.59,"count":279,"time_per_creation":0.41,"top_level_time":114.59,"top_level_count":279},{"name":"push_rule","time":109.05,"count":287,"time_per_creation":0.38,"top_level_time":109.05,"top_level_count":287},{"name":"discussion_note_on_merge_request","time":106.67,"count":264,"time_per_creation":0.4,"top_level_time":106.38,"top_level_count":258},{"name":"ci_bridge","time":106.08,"count":1046,"time_per_creation":0.1,"top_level_time":99.75,"top_level_count":822},{"name":"ee_cluster_agent","time":105.88,"count":136,"time_per_creation":0.78,"top_level_time":47.53,"top_level_count":70},{"name":"ci_runner","time":102.44,"count":1598,"time_per_creation":0.06,"top_level_time":101.01,"top_level_count":1526},{"name":"note_on_merge_request","time":100.74,"count":348,"time_per_creation":0.29,"top_level_time":100.74,"top_level_count":348}
],
    "filter": true
  }

FOSS

  {
    "fields": [
      {"key": "name", "label": "Name", "sortable": true},
      {"key": "time", "label": "Total runtime", "sortable": true},
      {"key": "count", "label": "Creations", "sortable": true},
      {"key": "time_per_creation", "label": "Time/Creation", "sortable": true},
      {"key": "top_level_time", "label": "Top-level runtime", "sortable": true},
      {"key": "top_level_count", "label": "Top-level creations", "sortable": true}
    ],
    "items": [{"name":"project","time":24001.35,"count":40101,"time_per_creation":0.6,"top_level_time":16112.23,"top_level_count":25410},{"name":"namespace","time":5370.02,"count":35665,"time_per_creation":0.15,"top_level_time":205.99,"top_level_count":1349},{"name":"merge_request","time":5315.08,"count":7711,"time_per_creation":0.69,"top_level_time":4955.35,"top_level_count":7287},{"name":"user","time":3401.62,"count":37862,"time_per_creation":0.09,"top_level_time":2590.42,"top_level_count":27101},{"name":"group","time":2294.95,"count":13978,"time_per_creation":0.16,"top_level_time":1799.54,"top_level_count":10765},{"name":"ci_pipeline","time":2158.3,"count":7859,"time_per_creation":0.27,"top_level_time":562.02,"top_level_count":4199},{"name":"ci_build","time":2020.44,"count":9158,"time_per_creation":0.22,"top_level_time":1521.06,"top_level_count":7334},{"name":"issue","time":1856.0,"count":10717,"time_per_creation":0.17,"top_level_time":1388.51,"top_level_count":9341},{"name":"organization","time":801.24,"count":69477,"time_per_creation":0.01,"top_level_time":8.08,"top_level_count":726},{"name":"conan_package","time":719.65,"count":926,"time_per_creation":0.78,"top_level_time":484.59,"top_level_count":454},{"name":"deployment","time":516.47,"count":990,"time_per_creation":0.52,"top_level_time":480.39,"top_level_count":898},{"name":"cluster","time":485.7,"count":2049,"time_per_creation":0.24,"top_level_time":383.72,"top_level_count":921},{"name":"project_member","time":482.6,"count":818,"time_per_creation":0.59,"top_level_time":480.33,"top_level_count":813},{"name":"packages_dependency","time":479.11,"count":946,"time_per_creation":0.51,"top_level_time":399.39,"top_level_count":782},{"name":"environment","time":426.44,"count":1768,"time_per_creation":0.24,"top_level_time":101.89,"top_level_count":1420},{"name":"todo","time":414.55,"count":1397,"time_per_creation":0.3,"top_level_time":414.55,"top_level_count":1397},{"name":"diff_note_on_merge_request","time":367.94,"count":909,"time_per_creation":0.4,"top_level_time":340.2,"top_level_count":873},{"name":"merge_request_with_diffs","time":322.44,"count":413,"time_per_creation":0.78,"top_level_time":322.44,"top_level_count":413},{"name":"wiki_page","time":299.2,"count":717,"time_per_creation":0.42,"top_level_time":286.62,"top_level_count":687},{"name":"ci_job_artifact","time":284.07,"count":3268,"time_per_creation":0.09,"top_level_time":226.64,"top_level_count":950},{"name":"personal_access_token","time":283.4,"count":15756,"time_per_creation":0.02,"top_level_time":283.4,"top_level_count":15756},{"name":"group_member","time":282.91,"count":1048,"time_per_creation":0.27,"top_level_time":282.42,"top_level_count":1045},{"name":"label","time":272.14,"count":2905,"time_per_creation":0.09,"top_level_time":103.07,"top_level_count":2537},{"name":"maven_package","time":262.66,"count":435,"time_per_creation":0.6,"top_level_time":262.66,"top_level_count":435},{"name":"personal_snippet","time":238.9,"count":855,"time_per_creation":0.28,"top_level_time":234.54,"top_level_count":836},{"name":"package","time":238.46,"count":647,"time_per_creation":0.37,"top_level_time":11.86,"top_level_count":178},{"name":"note","time":236.39,"count":1478,"time_per_creation":0.16,"top_level_time":168.64,"top_level_count":1359},{"name":"conan_metadatum","time":230.39,"count":463,"time_per_creation":0.5,"top_level_time":0.53,"top_level_count":1},{"name":"project_snippet","time":220.19,"count":870,"time_per_creation":0.25,"top_level_time":218.21,"top_level_count":838},{"name":"maven_metadatum","time":217.09,"count":449,"time_per_creation":0.48,"top_level_time":0.99,"top_level_count":15},{"name":"design","time":209.39,"count":1263,"time_per_creation":0.17,"top_level_time":139.95,"top_level_count":988},{"name":"admin","time":208.28,"count":1648,"time_per_creation":0.13,"top_level_time":208.28,"top_level_count":1648},{"name":"work_item","time":178.23,"count":1333,"time_per_creation":0.13,"top_level_time":127.63,"top_level_count":917},{"name":"npm_package","time":178.06,"count":860,"time_per_creation":0.21,"top_level_time":177.69,"top_level_count":859},{"name":"work_item_type","time":155.85,"count":13270,"time_per_creation":0.01,"top_level_time":0.49,"top_level_count":43},{"name":"list","time":155.57,"count":476,"time_per_creation":0.33,"top_level_time":155.57,"top_level_count":476},{"name":"project_empty_repo","time":148.36,"count":269,"time_per_creation":0.55,"top_level_time":126.85,"top_level_count":224},{"name":"terraform_state_version","time":137.64,"count":184,"time_per_creation":0.75,"top_level_time":68.69,"top_level_count":89},{"name":"packages_dependency_link","time":137.59,"count":2458,"time_per_creation":0.06,"top_level_time":137.59,"top_level_count":2458},{"name":"namespace_settings","time":133.62,"count":14336,"time_per_creation":0.01,"top_level_time":7.24,"top_level_count":67},{"name":"cluster_platform_kubernetes","time":130.68,"count":662,"time_per_creation":0.2,"top_level_time":25.14,"top_level_count":126},{"name":"labeled_issue","time":118.7,"count":726,"time_per_creation":0.16,"top_level_time":118.7,"top_level_count":726},{"name":"generic_commit_status","time":118.26,"count":360,"time_per_creation":0.33,"top_level_time":118.26,"top_level_count":360},{"name":"milestone","time":117.26,"count":2132,"time_per_creation":0.06,"top_level_time":103.36,"top_level_count":2088},{"name":"gpg_key","time":109.93,"count":82,"time_per_creation":1.34,"top_level_time":106.4,"top_level_count":80},{"name":"ci_empty_pipeline","time":109.73,"count":917,"time_per_creation":0.12,"top_level_time":76.85,"top_level_count":835},{"name":"author","time":102.66,"count":1182,"time_per_creation":0.09,"top_level_time":3.6,"top_level_count":41}],
    "filter": true
  }

EE

  {
    "fields": [
      {"key": "name", "label": "Name", "sortable": true},
      {"key": "time", "label": "Total runtime", "sortable": true},
      {"key": "count", "label": "Creations", "sortable": true},
      {"key": "time_per_creation", "label": "Time/Creation", "sortable": true},
      {"key": "top_level_time", "label": "Top-level runtime", "sortable": true},
      {"key": "top_level_count", "label": "Top-level creations", "sortable": true}
    ],
    "items": [{"name":"project","time":17961.12,"count":34202,"time_per_creation":0.53,"top_level_time":7494.82,"top_level_count":12647},{"name":"namespace","time":4511.65,"count":32057,"time_per_creation":0.14,"top_level_time":68.77,"top_level_count":486},{"name":"merge_request","time":3181.73,"count":4112,"time_per_creation":0.77,"top_level_time":2153.94,"top_level_count":3091},{"name":"vulnerabilities_finding","time":3077.34,"count":2388,"time_per_creation":1.29,"top_level_time":1082.45,"top_level_count":909},{"name":"vulnerability","time":2899.61,"count":1478,"time_per_creation":1.96,"top_level_time":2516.54,"top_level_count":1184},{"name":"group","time":2302.8,"count":17232,"time_per_creation":0.13,"top_level_time":1524.61,"top_level_count":11096},{"name":"user","time":2286.91,"count":29738,"time_per_creation":0.08,"top_level_time":1581.01,"top_level_count":19704},{"name":"ci_pipeline","time":1751.72,"count":4719,"time_per_creation":0.37,"top_level_time":128.05,"top_level_count":843},{"name":"vulnerabilities_scanner","time":1286.34,"count":3020,"time_per_creation":0.43,"top_level_time":7.9,"top_level_count":121},{"name":"ci_build","time":1186.56,"count":3310,"time_per_creation":0.36,"top_level_time":350.07,"top_level_count":1412},{"name":"vulnerabilities_identifier","time":1073.1,"count":2467,"time_per_creation":0.43,"top_level_time":50.41,"top_level_count":175},{"name":"epic","time":834.07,"count":3731,"time_per_creation":0.22,"top_level_time":677.62,"top_level_count":3199},{"name":"organization","time":700.91,"count":62553,"time_per_creation":0.01,"top_level_time":32.34,"top_level_count":3004},{"name":"issue","time":686.95,"count":4137,"time_per_creation":0.17,"top_level_time":538.6,"top_level_count":3189},{"name":"security_orchestration_policy_configuration","time":666.56,"count":1258,"time_per_creation":0.53,"top_level_time":403.97,"top_level_count":962},{"name":"group_member","time":499.52,"count":1997,"time_per_creation":0.25,"top_level_time":490.95,"top_level_count":1962},{"name":"geo_node","time":487.3,"count":2072,"time_per_creation":0.24,"top_level_time":483.7,"top_level_count":2059},{"name":"work_item","time":450.86,"count":4444,"time_per_creation":0.1,"top_level_time":160.51,"top_level_count":654},{"name":"terraform_state_version","time":433.02,"count":493,"time_per_creation":0.88,"top_level_time":125.31,"top_level_count":221},{"name":"author","time":420.34,"count":6004,"time_per_creation":0.07,"top_level_time":0.13,"top_level_count":2},{"name":"external_merge_request_diff","time":357.03,"count":331,"time_per_creation":1.08,"top_level_time":69.44,"top_level_count":60},{"name":"epic_tree_node","time":342.22,"count":800,"time_per_creation":0.43,"top_level_time":342.22,"top_level_count":800},{"name":"geo_terraform_state_version_registry","time":309.0,"count":283,"time_per_creation":1.09,"top_level_time":309.0,"top_level_count":283},{"name":"security_finding","time":299.37,"count":552,"time_per_creation":0.54,"top_level_time":124.24,"top_level_count":343},{"name":"wiki_page","time":291.36,"count":635,"time_per_creation":0.46,"top_level_time":291.36,"top_level_count":635},{"name":"geo_merge_request_diff_registry","time":289.63,"count":283,"time_per_creation":1.02,"top_level_time":289.63,"top_level_count":283},{"name":"upload","time":271.34,"count":666,"time_per_creation":0.41,"top_level_time":101.25,"top_level_count":329},{"name":"ci_pipeline_artifact","time":259.71,"count":434,"time_per_creation":0.6,"top_level_time":85.71,"top_level_count":163},{"name":"container_repository","time":247.79,"count":467,"time_per_creation":0.53,"top_level_time":89.44,"top_level_count":190},{"name":"merge_train_car","time":245.53,"count":126,"time_per_creation":1.95,"top_level_time":245.53,"top_level_count":126},{"name":"scan_result_policy_read","time":242.26,"count":314,"time_per_creation":0.77,"top_level_time":240.31,"top_level_count":312},{"name":"security_scan","time":239.49,"count":399,"time_per_creation":0.6,"top_level_time":125.83,"top_level_count":210},{"name":"project_member","time":230.83,"count":499,"time_per_creation":0.46,"top_level_time":208.98,"top_level_count":459},{"name":"package","time":223.15,"count":466,"time_per_creation":0.48,"top_level_time":2.09,"top_level_count":5},{"name":"admin","time":222.98,"count":1392,"time_per_creation":0.16,"top_level_time":222.98,"top_level_count":1392},{"name":"ci_job_artifact","time":221.86,"count":490,"time_per_creation":0.45,"top_level_time":77.65,"top_level_count":165},{"name":"pages_deployment","time":221.36,"count":510,"time_per_creation":0.43,"top_level_time":83.19,"top_level_count":238},{"name":"package_file","time":213.19,"count":669,"time_per_creation":0.32,"top_level_time":45.16,"top_level_count":89},{"name":"saml_provider","time":212.22,"count":1152,"time_per_creation":0.18,"top_level_time":193.88,"top_level_count":1054},{"name":"vulnerability_read","time":204.53,"count":173,"time_per_creation":1.18,"top_level_time":168.12,"top_level_count":85},{"name":"note","time":192.44,"count":1523,"time_per_creation":0.13,"top_level_time":189.8,"top_level_count":1519},{"name":"finding_map","time":191.25,"count":159,"time_per_creation":1.2,"top_level_time":191.25,"top_level_count":159},{"name":"epic_board_position","time":190.36,"count":491,"time_per_creation":0.39,"top_level_time":190.36,"top_level_count":491},{"name":"sbom_occurrence","time":187.14,"count":386,"time_per_creation":0.48,"top_level_time":174.67,"top_level_count":368},{"name":"ci_secure_file","time":186.75,"count":454,"time_per_creation":0.41,"top_level_time":42.75,"top_level_count":182},{"name":"merge_request_block","time":178.9,"count":162,"time_per_creation":1.1,"top_level_time":169.93,"top_level_count":157},{"name":"geo_pipeline_artifact_registry","time":176.21,"count":283,"time_per_creation":0.62,"top_level_time":176.21,"top_level_count":283},{"name":"geo_upload_registry","time":172.58,"count":337,"time_per_creation":0.51,"top_level_time":172.58,"top_level_count":337},{"name":"project_wiki_repository","time":171.39,"count":346,"time_per_creation":0.5,"top_level_time":30.4,"top_level_count":77},{"name":"workspace","time":167.21,"count":144,"time_per_creation":1.16,"top_level_time":167.21,"top_level_count":144},{"name":"design_management_repository","time":164.68,"count":416,"time_per_creation":0.4,"top_level_time":35.04,"top_level_count":147},{"name":"geo_package_file_registry","time":164.12,"count":320,"time_per_creation":0.51,"top_level_time":164.12,"top_level_count":320},{"name":"geo_container_repository_registry","time":160.85,"count":310,"time_per_creation":0.52,"top_level_time":160.85,"top_level_count":310},{"name":"namespace_settings","time":158.96,"count":18067,"time_per_creation":0.01,"top_level_time":2.1,"top_level_count":15},{"name":"terraform_state","time":153.62,"count":334,"time_per_creation":0.46,"top_level_time":1.2,"top_level_count":23},{"name":"deployment","time":151.97,"count":544,"time_per_creation":0.28,"top_level_time":102.26,"top_level_count":359},{"name":"environment","time":147.34,"count":850,"time_per_creation":0.17,"top_level_time":73.08,"top_level_count":769},{"name":"personal_access_token","time":146.48,"count":8465,"time_per_creation":0.02,"top_level_time":138.41,"top_level_count":8337},{"name":"geo_ci_secure_file_registry","time":145.89,"count":284,"time_per_creation":0.51,"top_level_time":145.89,"top_level_count":284},{"name":"geo_project_wiki_repository_registry","time":144.04,"count":281,"time_per_creation":0.51,"top_level_time":144.04,"top_level_count":281},{"name":"geo_job_artifact_registry","time":142.79,"count":234,"time_per_creation":0.61,"top_level_time":142.79,"top_level_count":234},{"name":"geo_pages_deployment_registry","time":140.1,"count":284,"time_per_creation":0.49,"top_level_time":140.1,"top_level_count":284},{"name":"geo_design_management_repository_registry","time":131.52,"count":281,"time_per_creation":0.47,"top_level_time":131.52,"top_level_count":281},{"name":"merge_request_diff","time":125.84,"count":113,"time_per_creation":1.11,"top_level_time":125.84,"top_level_count":113},{"name":"geo_project_repository_registry","time":114.59,"count":279,"time_per_creation":0.41,"top_level_time":114.59,"top_level_count":279},{"name":"work_item_type","time":113.08,"count":9418,"time_per_creation":0.01,"top_level_time":0.22,"top_level_count":18},{"name":"push_rule","time":108.99,"count":286,"time_per_creation":0.38,"top_level_time":108.99,"top_level_count":286},{"name":"ee_cluster_agent","time":105.88,"count":136,"time_per_creation":0.78,"top_level_time":47.53,"top_level_count":70}],
    "filter": true
  }

Event prof per spec type

  {
    "fields": [
      {"key": "type", "label": "Type", "sortable": true},
      {"key": "count", "label": "Factories created", "sortable": true},
      {"key": "time", "label": "Factories runtime (s)", "sortable": true},
      {"key": "run_time", "label": "Total runtime (s)", "sortable": true},
      {"key": "percent", "label": "% spent in factories", "sortable": true}
    ],
    "items": [{"type":"frontend","count":49,"time":42.96,"run_time":44.48,"percent":96.58},{"type":"job","count":33,"time":21.49,"run_time":25.6,"percent":83.95},{"type":"uploader","count":678,"time":308.41,"run_time":446.34,"percent":69.1},{"type":"replicator","count":1920,"time":827.17,"run_time":1214.49,"percent":68.11},{"type":"strategy","count":71,"time":9.35,"run_time":14.36,"percent":65.13},{"type":"finder","count":10995,"time":2296.18,"run_time":3682.0,"percent":62.36},{"type":"presenter","count":1742,"time":438.8,"run_time":717.72,"percent":61.14},{"type":"model","count":57905,"time":15436.52,"run_time":26688.02,"percent":57.84},{"type":"view","count":1705,"time":481.74,"run_time":902.34,"percent":53.39},{"type":"serializer","count":3247,"time":846.64,"run_time":1623.28,"percent":52.16},{"type":"channel","count":27,"time":4.15,"run_time":8.67,"percent":47.82},{"type":"graphql","count":7124,"time":1522.23,"run_time":3399.28,"percent":44.78},{"type":"policy","count":8425,"time":1530.2,"run_time":3448.1,"percent":44.38},{"type":"service","count":63585,"time":14999.76,"run_time":36172.97,"percent":41.47},{"type":"worker","count":5508,"time":1284.11,"run_time":3107.73,"percent":41.32},{"type":"controller","count":15103,"time":3140.25,"run_time":7836.79,"percent":40.07},{"type":"helper","count":2829,"time":593.62,"run_time":1560.78,"percent":38.03},{"type":"request","count":73252,"time":10535.36,"run_time":32173.73,"percent":32.75},{"type":"elastic","count":312,"time":162.29,"run_time":522.44,"percent":31.06},{"type":"mailer","count":1662,"time":250.78,"run_time":847.51,"percent":29.59},{"type":"validator","count":87,"time":21.3,"run_time":81.12,"percent":26.26},{"type":"lib","count":40432,"time":9910.88,"run_time":43365.98,"percent":22.85},{"type":"routing","count":98,"time":12.64,"run_time":83.8,"percent":15.08},{"type":"task","count":671,"time":242.0,"run_time":1680.99,"percent":14.4},{"type":"elastic_integration","count":135,"time":26.4,"run_time":237.67,"percent":11.11},{"type":"feature","count":26257,"time":6575.37,"run_time":60801.2,"percent":10.81},{"type":"component","count":106,"time":7.45,"run_time":91.64,"percent":8.13},{"type":"initializer","count":83,"time":7.18,"run_time":98.24,"percent":7.3},{"type":"support_spec","count":35,"time":1.3,"run_time":52.0,"percent":2.5},{"type":"dependency","count":1,"time":0.01,"run_time":0.37,"percent":2.21},{"type":"sidekiq","count":1,"time":0.01,"run_time":0.4,"percent":2.19},{"type":"spam","count":1,"time":0.01,"run_time":0.43,"percent":2.06},{"type":"dot_gitlab_ci","count":7,"time":1.37,"run_time":69.07,"percent":1.98},{"type":"db","count":103,"time":9.25,"run_time":709.46,"percent":1.3},{"type":"sidekiq_cluster","count":1,"time":0.01,"run_time":0.83,"percent":0.91},{"type":"contract","count":1,"time":0.01,"run_time":1.21,"percent":0.7},{"type":"rubocop","count":164,"time":1.31,"run_time":196.2,"percent":0.67},{"type":"keep","count":8,"time":0.07,"run_time":10.15,"percent":0.66},{"type":"experiment","count":3,"time":0.02,"run_time":5.38,"percent":0.45},{"type":"tooling","count":64,"time":0.58,"run_time":148.61,"percent":0.39},{"type":"undefined","count":4,"time":0.03,"run_time":8.56,"percent":0.34},{"type":"haml_lint","count":3,"time":0.02,"run_time":8.13,"percent":0.29},{"type":"rack_server","count":1,"time":0.02,"run_time":8.24,"percent":0.19},{"type":"rubocop_rspec","count":21,"time":0.17,"run_time":98.22,"percent":0.17},{"type":"bin","count":5,"time":0.04,"run_time":34.95,"percent":0.11},{"type":"command","count":2,"time":0.02,"run_time":18.46,"percent":0.09},{"type":"script","count":28,"time":0.23,"run_time":408.81,"percent":0.06},{"type":"config","count":8,"time":0.07,"run_time":138.24,"percent":0.05},{"type":"migration","count":323,"time":6.25,"run_time":36147.53,"percent":0.02}],
    "filter": true
  }

How to run locally?

Factory Prof

  1. Trigger manual CI job update-tests-metadata in post-test stage and download data
  2. Run "Script" below like FORMAT=json ruby factory_prof.rb factory_prof.json
Script
#!/usr/bin/env ruby

require 'json'

file = ARGV[0] || 'tmp/test_prof/facrory_prof.json'

warn "Reading #{file}..."

data = JSON(File.read(file))

def time_percentage(time, total_time)
  (time / total_time * 100).round(2)
end

def ff(fl)
  fl.round(2)
end

def sum(set)
  {
    time: set.sum { |e| e['total_time'] },
    count: set.sum { |e| e['total_count'] },
    top_level_time: set.sum { |e| e['top_level_time'] },
    top_level_count: set.sum { |e| e['top_level_count'] }
  }
end

by_name = data.values.flatten(1).group_by { |k| k["name"] }
factory_runtime = by_name.transform_values { |values| sum(values) }

items = factory_runtime.sort_by { |_, v| -v[:time] }.map do |name, v|
  {
    name: name,
    time: ff(v[:time]),
    count: v[:count],
    time_per_creation: ff(v[:time] / v[:count]),
    top_level_time: ff(v[:top_level_time]),
    top_level_count: v[:top_level_count]
  }
end

case ENV['FORMAT']
when 'json'
  puts <<~MD
    ```json:table
      {
        "fields": [
          {"key": "name", "label": "Name", "sortable": true},
          {"key": "time", "label": "Total runtime", "sortable": true},
          {"key": "count", "label": "Creations", "sortable": true},
          {"key": "time_per_creation", "label": "Time/Creation", "sortable": true},
          {"key": "top_level_time", "label": "Top-level runtime", "sortable": true},
          {"key": "top_level_count", "label": "Top-level creations", "sortable": true}
        ],
        "items": #{JSON.generate(items)},
        "filter": true
      }
    ```
  MD
else
  puts <<~MD
    | Name | Total runtime | Creations | Time/Creation | Top-level runtime | Top-level creations |
    | ---- | ------------: | --------: | ------------: | ----------------: | ------------------: |
  MD

  items.each do |v|
    line = v.values_at(:name, :time, :count, :time_per_creation, :top_level_time, :top_level_count).join(' | ')
    puts "| #{line} |"
  end
end

Event Prof

  1. Trigger manual CI job update-tests-metadata in post-test stage and download data
  2. Run "Script" below like FORMAT=json ruby event_prof.rb event_prof.json
Script
#!/usr/bin/env ruby

require 'json'

file = ARGV[0] || 'tmp/test_prof/event_prof.json'

warn "Reading #{file}..."

data = JSON(File.read(file))

def time_percentage(time, total_time)
  (time / total_time * 100).round(2)
end

def ff(fl)
  fl.round(2)
end

def sum_by(key, set)
  time = set.sum { |_, e| e.dig(key, 'time') }
  run_time = set.sum { |_, e| e.dig(key, 'run_time') }
  count = set.sum { |_, e| e.dig(key, 'count') }

  {
    time: time,
    run_time: run_time,
    count: count,
    percent: time_percentage(time, run_time)
  }
end

by_type = data.group_by { |_k, v| v["type"] }

type = ENV['TYPE']

if type
  items = by_type[type]
    .map { |k, v| [k, v['factory.create']] }
    .sort_by { |_, v| -time_percentage(v['time'], v['run_time']) }
    .first(100)
    .map do |k, v|
      v.merge(
        file: k,
        time: ff(v['time']),
        run_time: ff(v['run_time']),
        percent: time_percentage(v['time'], v['run_time'])
      )
    end

  puts <<~MD
    ## #{type.upcase} Top 100

    ```json:table
      {
        "fields": [
          {"key": "file", "label": "File", "sortable": true},
          {"key": "count", "label": "Factories created", "sortable": true},
          {"key": "time", "label": "Factories runtime (s)", "sortable": true},
          {"key": "run_time", "label": "Total runtime (s)", "sortable": true},
          {"key": "percent", "label": "% spent in factories", "sortable": true}
        ],
        "items": #{JSON.generate(items)},
        "filter": true
      }
    ```
  MD

  exit
end

factory_create = by_type.to_h { |type, set| [type, sum_by('factory.create', set)] }

case ENV['FORMAT']
when 'json'
  items = factory_create.sort_by { |_, v| -v[:percent] }.map do |type, v|
    {
      type: type,
      count: v[:count],
      time: ff(v[:time]),
      run_time: ff(v[:run_time]),
      percent: v[:percent]
    }
  end

  puts <<~MD
    ```json:table
      {
        "fields": [
          {"key": "type", "label": "Type", "sortable": true},
          {"key": "count", "label": "Factories created", "sortable": true},
          {"key": "time", "label": "Factories runtime (s)", "sortable": true},
          {"key": "run_time", "label": "Total runtime (s)", "sortable": true},
          {"key": "percent", "label": "% spent in factories", "sortable": true}
        ],
        "items": #{JSON.generate(items)},
        "filter": true
      }
    ```
  MD
else
  puts <<~MD
    | Type | Factories created | Factories runtime (s) | Total runtime (s) | Percent spent in factories |
    | -------- | ---------: | -----------------: | -------------: | -------: |
  MD

  factory_create.sort_by { |_, v| -v[:percent] }.each do |type, v|
    puts <<~MD
      | #{type} | #{v[:count]} | #{ff v[:time]} | #{ff v[:run_time]} | #{v[:percent]} |
    MD
  end
end
Edited by Peter Leitzen

Merge request reports

Loading