-
Notifications
You must be signed in to change notification settings - Fork 449
fix(ci_visibility): ensure spans are finished by the end of the session #14066
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 278 ± 3 ms. The average import time from base is: 278 ± 2 ms. The import time difference between this PR and base is: -0.2 ± 0.1 ms. The difference is not statistically significant (z = -2.11). Import time breakdownThe following import paths have shrunk:
|
Performance SLOsPerformance SLOsBenchmark execution time: 2025-07-18 16:23:53 Comparing candidate commit fdd00ab in branch coreapiscenario-context_with_data_listeners
coreapiscenario-context_with_data_no_listeners
coreapiscenario-context_with_data_only_all_listeners
coreapiscenario-get_item_exists
coreapiscenario-get_item_missing
coreapiscenario-set_item
djangosimple-appsec
djangosimple-exception-replay-enabled
djangosimple-iast
djangosimple-profiler
djangosimple-span-code-origin
djangosimple-tracer
djangosimple-tracer-and-profiler
djangosimple-tracer-no-caches
djangosimple-tracer-no-databases
djangosimple-tracer-no-middleware
djangosimple-tracer-no-templates
errortrackingdjangosimple-errortracking-enabled-all
errortrackingdjangosimple-errortracking-enabled-user
errortrackingdjangosimple-tracer-enabled
errortrackingflasksqli-errortracking-enabled-all
errortrackingflasksqli-errortracking-enabled-user
errortrackingflasksqli-tracer-enabled
flasksimple-appsec-get
flasksimple-appsec-post
flasksimple-appsec-telemetry
flasksimple-debugger
flasksimple-iast-get
flasksimple-profiler
flasksimple-tracer
flasksqli-appsec-enabled
flasksqli-iast-enabled
flasksqli-tracer-enabled
httppropagationextract-all_styles_all_headers
httppropagationextract-b3_headers
httppropagationextract-b3_single_headers
httppropagationextract-datadog_tracecontext_tracestate_not_propagated_on_trace_id_no_match
httppropagationextract-datadog_tracecontext_tracestate_propagated_on_trace_id_match
httppropagationextract-empty_headers
httppropagationextract-full_t_id_datadog_headers
httppropagationextract-invalid_priority_header
httppropagationextract-invalid_span_id_header
httppropagationextract-invalid_tags_header
httppropagationextract-invalid_trace_id_header
httppropagationextract-large_header_no_matches
httppropagationextract-large_valid_headers_all
httppropagationextract-medium_header_no_matches
httppropagationextract-medium_valid_headers_all
httppropagationextract-none_propagation_style
httppropagationextract-tracecontext_headers
httppropagationextract-valid_headers_all
httppropagationextract-valid_headers_basic
httppropagationextract-wsgi_empty_headers
httppropagationextract-wsgi_invalid_priority_header
httppropagationextract-wsgi_invalid_span_id_header
httppropagationextract-wsgi_invalid_tags_header
httppropagationextract-wsgi_invalid_trace_id_header
httppropagationextract-wsgi_large_header_no_matches
httppropagationextract-wsgi_large_valid_headers_all
httppropagationextract-wsgi_medium_header_no_matches
httppropagationextract-wsgi_medium_valid_headers_all
httppropagationextract-wsgi_valid_headers_all
httppropagationextract-wsgi_valid_headers_basic
httppropagationinject-ids_only
httppropagationinject-with_all
httppropagationinject-with_dd_origin
httppropagationinject-with_priority_and_origin
httppropagationinject-with_sampling_priority
httppropagationinject-with_tags
httppropagationinject-with_tags_invalid
httppropagationinject-with_tags_max_size
iast_aspects-re_expand_aspect
iast_aspects-re_expand_noaspect
iast_aspects-re_findall_aspect
iast_aspects-re_findall_noaspect
iast_aspects-re_finditer_aspect
iast_aspects-re_finditer_noaspect
iast_aspects-re_fullmatch_aspect
iast_aspects-re_fullmatch_noaspect
iast_aspects-re_group_aspect
iast_aspects-re_group_noaspect
iast_aspects-re_groups_aspect
iast_aspects-re_groups_noaspect
iast_aspects-re_match_aspect
iast_aspects-re_match_noaspect
iast_aspects-re_search_aspect
iast_aspects-re_search_noaspect
iast_aspects-re_sub_aspect
iast_aspects-re_sub_noaspect
iast_aspects-re_subn_aspect
iast_aspects-re_subn_noaspect
iastaspects-add_aspect
iastaspects-add_inplace_aspect
iastaspects-add_inplace_noaspect
iastaspects-add_noaspect
iastaspects-bytearray_aspect
iastaspects-bytearray_extend_aspect
iastaspects-bytearray_extend_noaspect
iastaspects-bytearray_noaspect
iastaspects-bytes_aspect
iastaspects-bytes_noaspect
iastaspects-bytesio_aspect
iastaspects-bytesio_noaspect
iastaspects-capitalize_aspect
iastaspects-capitalize_noaspect
iastaspects-casefold_aspect
iastaspects-casefold_noaspect
iastaspects-decode_aspect
iastaspects-decode_noaspect
iastaspects-encode_aspect
iastaspects-encode_noaspect
iastaspects-format_aspect
iastaspects-format_map_aspect
iastaspects-format_map_noaspect
iastaspects-format_noaspect
iastaspects-index_aspect
iastaspects-index_noaspect
iastaspects-join_aspect
iastaspects-join_noaspect
iastaspects-ljust_aspect
iastaspects-ljust_noaspect
iastaspects-lower_aspect
iastaspects-lower_noaspect
iastaspects-lstrip_aspect
iastaspects-lstrip_noaspect
iastaspects-modulo_aspect
iastaspects-modulo_aspect_for_bytearray_bytearray
iastaspects-modulo_aspect_for_bytes
iastaspects-modulo_aspect_for_bytes_bytearray
iastaspects-modulo_noaspect
iastaspects-replace_aspect
iastaspects-replace_noaspect
iastaspects-repr_aspect
iastaspects-repr_noaspect
iastaspects-rstrip_aspect
iastaspects-rstrip_noaspect
iastaspects-slice_aspect
iastaspects-slice_noaspect
iastaspects-stringio_aspect
iastaspects-stringio_noaspect
iastaspects-strip_aspect
iastaspects-strip_noaspect
iastaspects-swapcase_aspect
iastaspects-swapcase_noaspect
iastaspects-title_aspect
iastaspects-title_noaspect
iastaspects-translate_aspect
iastaspects-translate_noaspect
iastaspects-upper_aspect
iastaspects-upper_noaspect
iastaspectsospath-ospathbasename_aspect
iastaspectsospath-ospathbasename_noaspect
iastaspectsospath-ospathjoin_aspect
iastaspectsospath-ospathjoin_noaspect
iastaspectsospath-ospathnormcase_aspect
iastaspectsospath-ospathnormcase_noaspect
iastaspectsospath-ospathsplit_aspect
iastaspectsospath-ospathsplit_noaspect
iastaspectsospath-ospathsplitdrive_aspect
iastaspectsospath-ospathsplitdrive_noaspect
iastaspectsospath-ospathsplitext_aspect
iastaspectsospath-ospathsplitext_noaspect
iastaspectssplit-rsplit_aspect
iastaspectssplit-rsplit_noaspect
iastaspectssplit-split_aspect
iastaspectssplit-split_noaspect
iastaspectssplit-splitlines_aspect
iastaspectssplit-splitlines_noaspect
iastpropagation-no-propagation
iastpropagation-propagation_enabled
iastpropagation-propagation_enabled_100
iastpropagation-propagation_enabled_1000
otelsdkspan-add-event
otelsdkspan-add-link
otelsdkspan-add-metrics
otelsdkspan-add-tags
otelsdkspan-get-context
otelsdkspan-is-recording
otelsdkspan-record-exception
otelsdkspan-set-status
otelsdkspan-start
otelsdkspan-start-finish
otelsdkspan-start-finish-telemetry
otelsdkspan-update-name
otelspan-add-event
otelspan-add-metrics
otelspan-add-tags
otelspan-get-context
otelspan-is-recording
otelspan-record-exception
otelspan-set-status
otelspan-start
otelspan-start-finish
otelspan-start-finish-telemetry
otelspan-update-name
packagespackageforrootmodulemapping-cache_off
packagespackageforrootmodulemapping-cache_on
packagesupdateimporteddependencies-import_many
packagesupdateimporteddependencies-import_many_cached
packagesupdateimporteddependencies-import_many_stdlib
packagesupdateimporteddependencies-import_many_stdlib_cached
packagesupdateimporteddependencies-import_many_unknown
packagesupdateimporteddependencies-import_many_unknown_cached
packagesupdateimporteddependencies-import_one
packagesupdateimporteddependencies-import_one_cache
packagesupdateimporteddependencies-import_one_stdlib
packagesupdateimporteddependencies-import_one_stdlib_cache
packagesupdateimporteddependencies-import_one_unknown
packagesupdateimporteddependencies-import_one_unknown_cache
ratelimiter-defaults
ratelimiter-high_rate_limit
ratelimiter-long_window
ratelimiter-low_rate_limit
ratelimiter-no_rate_limit
ratelimiter-short_window
recursivecomputation-deep
recursivecomputation-deep-profiled
recursivecomputation-medium
recursivecomputation-shallow
samplingrules-average_match
samplingrules-high_match
samplingrules-low_match
samplingrules-very_low_match
sethttpmeta-all-disabled
sethttpmeta-all-enabled
sethttpmeta-collectipvariant_exists
sethttpmeta-no-collectipvariant
sethttpmeta-no-useragentvariant
sethttpmeta-obfuscation-no-query
sethttpmeta-obfuscation-regular-case-explicit-query
sethttpmeta-obfuscation-regular-case-implicit-query
sethttpmeta-obfuscation-send-querystring-disabled
sethttpmeta-obfuscation-worst-case-explicit-query
sethttpmeta-obfuscation-worst-case-implicit-query
sethttpmeta-useragentvariant_exists_1
sethttpmeta-useragentvariant_exists_2
sethttpmeta-useragentvariant_exists_3
sethttpmeta-useragentvariant_not_exists_1
sethttpmeta-useragentvariant_not_exists_2
span-add-event
span-add-metrics
span-add-tags
span-get-context
span-is-recording
span-record-exception
span-set-status
span-start
span-start-finish
span-start-finish-telemetry
span-start-finish-traceid128
span-start-traceid128
span-update-name
telemetryaddmetric-1-count-metric-1-times
telemetryaddmetric-1-count-metrics-100-times
telemetryaddmetric-1-distribution-metric-1-times
telemetryaddmetric-1-distribution-metrics-100-times
telemetryaddmetric-1-gauge-metric-1-times
telemetryaddmetric-1-gauge-metrics-100-times
telemetryaddmetric-1-rate-metric-1-times
telemetryaddmetric-1-rate-metrics-100-times
telemetryaddmetric-100-count-metrics-100-times
telemetryaddmetric-100-distribution-metrics-100-times
telemetryaddmetric-100-gauge-metrics-100-times
telemetryaddmetric-100-rate-metrics-100-times
telemetryaddmetric-flush-1-metric
telemetryaddmetric-flush-100-metrics
telemetryaddmetric-flush-1000-metrics
tracer-large
tracer-medium
tracer-small
Legend:
Note: All comparisons are against the mean unless a different statistic (e.g., p95) is explicitly shown. |
At the end of the test session, we finish all unfinished spans recursively by calling
test_session.finish(force=True)
, butforce
only applies if the item's current status isSPECIAL_STATUS.UNFINISHED
. It looks like in some obscure circumstances, a test can be unfinished without having theSPECIAL_STATUS.UNFINISHED
status, and in this case the recursive finish will ignore them. This PR changes the logic so that any unfinished span is finished.Also, test spans don't have a parent (they have their own context, separate from the test session/module/suite). This means that when a test span finishes, there is no parent to reactivate, and so there is no active span. This confuses the logic that checks for unfinished spans when finish test session/module/suite. This PR reactivates the parent span to avoid this issue.
Checklist
Reviewer Checklist