Skip to content
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

ekump/APMSP-1756 add trace exporter integration tests #897

Merged
merged 7 commits into from
Feb 26, 2025

Conversation

ekump
Copy link
Contributor

@ekump ekump commented Feb 25, 2025

What does this PR do?

  • Add initial integration tests for the DataPipeline::TraceExporter. These tests closely resemble existing tests for the TraceUtils::SendData, but flow through the exporter. The SendData tests are still necessary as there are places in libdatadog (like the Sidecar) that currently bypass the exporter. Identical snapshot tests have been added for http and UDS.
  • Update test_send_data to cover the payload collection construction steps.
  • Add a test-only feature to gate adding query params to the agent's trace endpoint URI.
  • Minor tweak to v0.4 msgpack span decoding error handling to include invalid keys in the message.

How to test the change?

Integration tests are included by default when running cargo nextest run locally. UDS related tests run on linux only and can be run locally on macOS via docker.

@ekump ekump force-pushed the ekump/APMSP-1756-add-trace-exporter-integration-tests branch 2 times, most recently from 716181e to 07ba635 Compare February 25, 2025 22:21
@pr-commenter
Copy link

pr-commenter bot commented Feb 25, 2025

Benchmarks

Comparison

Benchmark execution time: 2025-02-26 23:02:43

Comparing candidate commit c2216f2 in PR branch ekump/APMSP-1756-add-trace-exporter-integration-tests with baseline commit b145b2f in branch main.

Found 2 performance improvements and 7 performance regressions! Performance is the same for 43 metrics, 2 unstable metrics.

scenario:credit_card/is_card_number/x371413321323331

  • 🟥 execution_time [+616.123ns; +633.445ns] or [+10.203%; +10.490%]
  • 🟥 throughput [-15712519.988op/s; -15317893.175op/s] or [-9.488%; -9.250%]

scenario:credit_card/is_card_number_no_luhn/ 3782-8224-6310-005

  • 🟩 execution_time [-2.874µs; -2.765µs] or [-4.312%; -4.148%]
  • 🟩 throughput [+649722.839op/s; +674506.661op/s] or [+4.331%; +4.496%]

scenario:credit_card/is_card_number_no_luhn/ 378282246310005

  • 🟥 execution_time [+14.061µs; +14.391µs] or [+23.556%; +24.110%]
  • 🟥 throughput [-3251333.624op/s; -3190420.743op/s] or [-19.407%; -19.044%]

scenario:credit_card/is_card_number_no_luhn/x371413321323331

  • 🟥 execution_time [+593.584ns; +610.502ns] or [+9.830%; +10.110%]
  • 🟥 throughput [-15194833.598op/s; -14809416.936op/s] or [-9.175%; -8.943%]

scenario:sql/obfuscate_sql_string

  • 🟥 execution_time [+3.092µs; +3.180µs] or [+4.707%; +4.843%]

Candidate

Candidate benchmark details

Group 1

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
credit_card/is_card_number/ execution_time 3.896µs 3.914µs ± 0.003µs 3.914µs ± 0.001µs 3.915µs 3.917µs 3.918µs 3.922µs 0.19% -2.030 12.406 0.06% 0.000µs 1 200
credit_card/is_card_number/ throughput 255002591.944op/s 255499349.362op/s ± 166200.000op/s 255486471.993op/s ± 73146.498op/s 255561865.139op/s 255801878.204op/s 255891441.242op/s 256691897.488op/s 0.47% 2.050 12.568 0.06% 11752.115op/s 1 200
credit_card/is_card_number/ 3782-8224-6310-005 execution_time 82.263µs 82.584µs ± 0.200µs 82.514µs ± 0.093µs 82.683µs 82.981µs 83.213µs 83.672µs 1.40% 1.846 5.052 0.24% 0.014µs 1 200
credit_card/is_card_number/ 3782-8224-6310-005 throughput 11951485.589op/s 12108968.984op/s ± 29161.764op/s 12119179.615op/s ± 13625.876op/s 12128483.789op/s 12137032.173op/s 12147777.446op/s 12156072.815op/s 0.30% -1.820 4.889 0.24% 2062.048op/s 1 200
credit_card/is_card_number/ 378282246310005 execution_time 76.507µs 77.027µs ± 0.322µs 76.978µs ± 0.228µs 77.218µs 77.623µs 77.851µs 78.098µs 1.46% 0.747 0.281 0.42% 0.023µs 1 200
credit_card/is_card_number/ 378282246310005 throughput 12804427.732op/s 12982622.354op/s ± 54130.335op/s 12990787.586op/s ± 38476.419op/s 13025585.978op/s 13057022.367op/s 13065977.044op/s 13070684.957op/s 0.62% -0.726 0.229 0.42% 3827.593op/s 1 200
credit_card/is_card_number/37828224631 execution_time 3.896µs 3.914µs ± 0.002µs 3.914µs ± 0.001µs 3.915µs 3.918µs 3.920µs 3.922µs 0.19% -2.474 20.609 0.06% 0.000µs 1 200
credit_card/is_card_number/37828224631 throughput 254970528.201op/s 255464020.157op/s ± 152880.517op/s 255464209.464op/s ± 71545.393op/s 255540860.985op/s 255620456.028op/s 255876123.862op/s 256698809.108op/s 0.48% 2.504 20.872 0.06% 10810.285op/s 1 200
credit_card/is_card_number/378282246310005 execution_time 72.757µs 73.856µs ± 0.454µs 73.869µs ± 0.278µs 74.128µs 74.675µs 75.159µs 75.553µs 2.28% 0.434 0.718 0.61% 0.032µs 1 200
credit_card/is_card_number/378282246310005 throughput 13235762.407op/s 13540421.175op/s ± 83102.201op/s 13537545.887op/s ± 50956.949op/s 13596237.245op/s 13672765.711op/s 13711377.437op/s 13744387.540op/s 1.53% -0.388 0.635 0.61% 5876.213op/s 1 200
credit_card/is_card_number/37828224631000521389798 execution_time 51.965µs 52.255µs ± 0.125µs 52.254µs ± 0.090µs 52.342µs 52.469µs 52.541µs 52.549µs 0.56% 0.106 -0.480 0.24% 0.009µs 1 200
credit_card/is_card_number/37828224631000521389798 throughput 19029680.553op/s 19136928.966op/s ± 45653.772op/s 19137113.531op/s ± 32908.975op/s 19172516.204op/s 19208538.313op/s 19229404.188op/s 19243806.601op/s 0.56% -0.096 -0.482 0.24% 3228.209op/s 1 200
credit_card/is_card_number/x371413321323331 execution_time 6.476µs 6.663µs ± 0.061µs 6.673µs ± 0.041µs 6.711µs 6.753µs 6.781µs 6.805µs 1.97% -0.367 -0.257 0.92% 0.004µs 1 200
credit_card/is_card_number/x371413321323331 throughput 146957218.545op/s 150086202.776op/s ± 1387552.385op/s 149853155.994op/s ± 915654.350op/s 150853238.824op/s 152591041.031op/s 153409824.974op/s 154419794.318op/s 3.05% 0.412 -0.212 0.92% 98114.770op/s 1 200
credit_card/is_card_number_no_luhn/ execution_time 3.898µs 3.914µs ± 0.003µs 3.914µs ± 0.001µs 3.915µs 3.918µs 3.923µs 3.929µs 0.38% -0.013 5.683 0.08% 0.000µs 1 200
credit_card/is_card_number_no_luhn/ throughput 254537491.928op/s 255488415.300op/s ± 201046.897op/s 255496857.389op/s ± 96731.607op/s 255586445.726op/s 255733324.878op/s 255997056.434op/s 256524919.664op/s 0.40% 0.031 5.698 0.08% 14216.162op/s 1 200
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 execution_time 63.632µs 63.841µs ± 0.116µs 63.822µs ± 0.044µs 63.866µs 64.008µs 64.218µs 64.693µs 1.37% 3.022 15.984 0.18% 0.008µs 1 200
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 throughput 15457513.351op/s 15663876.245op/s ± 28304.834op/s 15668553.996op/s ± 10782.655op/s 15679270.045op/s 15693349.630op/s 15707014.527op/s 15715368.058op/s 0.30% -2.974 15.545 0.18% 2001.454op/s 1 200
credit_card/is_card_number_no_luhn/ 378282246310005 execution_time 72.050µs 73.916µs ± 1.187µs 74.011µs ± 0.996µs 74.946µs 75.663µs 75.889µs 76.024µs 2.72% -0.112 -1.237 1.60% 0.084µs 1 200
credit_card/is_card_number_no_luhn/ 378282246310005 throughput 13153812.168op/s 13532302.566op/s ± 217826.724op/s 13511484.241op/s ± 181840.799op/s 13720775.518op/s 13861752.097op/s 13869663.459op/s 13879271.767op/s 2.72% 0.147 -1.236 1.61% 15402.675op/s 1 200
credit_card/is_card_number_no_luhn/37828224631 execution_time 3.899µs 3.915µs ± 0.002µs 3.915µs ± 0.001µs 3.916µs 3.918µs 3.920µs 3.923µs 0.21% -1.454 13.524 0.05% 0.000µs 1 200
credit_card/is_card_number_no_luhn/37828224631 throughput 254927941.699op/s 255451787.926op/s ± 137695.541op/s 255458168.725op/s ± 69441.041op/s 255520154.152op/s 255610767.660op/s 255764245.393op/s 256448217.283op/s 0.39% 1.476 13.672 0.05% 9736.545op/s 1 200
credit_card/is_card_number_no_luhn/378282246310005 execution_time 54.571µs 54.706µs ± 0.115µs 54.674µs ± 0.025µs 54.707µs 54.994µs 55.148µs 55.259µs 1.07% 2.842 8.042 0.21% 0.008µs 1 200
credit_card/is_card_number_no_luhn/378282246310005 throughput 18096495.856op/s 18279602.992op/s ± 38094.122op/s 18290296.083op/s ± 8369.029op/s 18297198.242op/s 18310985.676op/s 18316271.205op/s 18324848.495op/s 0.19% -2.830 7.972 0.21% 2693.661op/s 1 200
credit_card/is_card_number_no_luhn/37828224631000521389798 execution_time 51.940µs 52.211µs ± 0.113µs 52.213µs ± 0.075µs 52.278µs 52.424µs 52.474µs 52.578µs 0.70% 0.302 0.098 0.22% 0.008µs 1 200
credit_card/is_card_number_no_luhn/37828224631000521389798 throughput 19019470.985op/s 19153257.921op/s ± 41415.269op/s 19152496.068op/s ± 27465.667op/s 19181678.163op/s 19218349.839op/s 19239629.039op/s 19252897.335op/s 0.52% -0.289 0.085 0.22% 2928.502op/s 1 200
credit_card/is_card_number_no_luhn/x371413321323331 execution_time 6.502µs 6.640µs ± 0.060µs 6.639µs ± 0.042µs 6.678µs 6.728µs 6.760µs 6.796µs 2.37% -0.037 -0.554 0.91% 0.004µs 1 200
credit_card/is_card_number_no_luhn/x371413321323331 throughput 147136978.368op/s 150603943.422op/s ± 1372234.037op/s 150624785.820op/s ± 949932.213op/s 151656250.042op/s 152876413.534op/s 153494354.765op/s 153787059.999op/s 2.10% 0.076 -0.556 0.91% 97031.599op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
credit_card/is_card_number/ execution_time [3.914µs; 3.914µs] or [-0.009%; +0.009%] None None None
credit_card/is_card_number/ throughput [255476315.641op/s; 255522383.084op/s] or [-0.009%; +0.009%] None None None
credit_card/is_card_number/ 3782-8224-6310-005 execution_time [82.556µs; 82.612µs] or [-0.034%; +0.034%] None None None
credit_card/is_card_number/ 3782-8224-6310-005 throughput [12104927.444op/s; 12113010.524op/s] or [-0.033%; +0.033%] None None None
credit_card/is_card_number/ 378282246310005 execution_time [76.983µs; 77.072µs] or [-0.058%; +0.058%] None None None
credit_card/is_card_number/ 378282246310005 throughput [12975120.411op/s; 12990124.298op/s] or [-0.058%; +0.058%] None None None
credit_card/is_card_number/37828224631 execution_time [3.914µs; 3.915µs] or [-0.008%; +0.008%] None None None
credit_card/is_card_number/37828224631 throughput [255442832.388op/s; 255485207.926op/s] or [-0.008%; +0.008%] None None None
credit_card/is_card_number/378282246310005 execution_time [73.793µs; 73.919µs] or [-0.085%; +0.085%] None None None
credit_card/is_card_number/378282246310005 throughput [13528904.009op/s; 13551938.341op/s] or [-0.085%; +0.085%] None None None
credit_card/is_card_number/37828224631000521389798 execution_time [52.238µs; 52.273µs] or [-0.033%; +0.033%] None None None
credit_card/is_card_number/37828224631000521389798 throughput [19130601.792op/s; 19143256.140op/s] or [-0.033%; +0.033%] None None None
credit_card/is_card_number/x371413321323331 execution_time [6.655µs; 6.672µs] or [-0.128%; +0.128%] None None None
credit_card/is_card_number/x371413321323331 throughput [149893901.360op/s; 150278504.192op/s] or [-0.128%; +0.128%] None None None
credit_card/is_card_number_no_luhn/ execution_time [3.914µs; 3.915µs] or [-0.011%; +0.011%] None None None
credit_card/is_card_number_no_luhn/ throughput [255460552.133op/s; 255516278.466op/s] or [-0.011%; +0.011%] None None None
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 execution_time [63.825µs; 63.857µs] or [-0.025%; +0.025%] None None None
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 throughput [15659953.467op/s; 15667799.022op/s] or [-0.025%; +0.025%] None None None
credit_card/is_card_number_no_luhn/ 378282246310005 execution_time [73.752µs; 74.081µs] or [-0.223%; +0.223%] None None None
credit_card/is_card_number_no_luhn/ 378282246310005 throughput [13502113.877op/s; 13562491.255op/s] or [-0.223%; +0.223%] None None None
credit_card/is_card_number_no_luhn/37828224631 execution_time [3.914µs; 3.915µs] or [-0.007%; +0.007%] None None None
credit_card/is_card_number_no_luhn/37828224631 throughput [255432704.648op/s; 255470871.204op/s] or [-0.007%; +0.007%] None None None
credit_card/is_card_number_no_luhn/378282246310005 execution_time [54.690µs; 54.722µs] or [-0.029%; +0.029%] None None None
credit_card/is_card_number_no_luhn/378282246310005 throughput [18274323.513op/s; 18284882.471op/s] or [-0.029%; +0.029%] None None None
credit_card/is_card_number_no_luhn/37828224631000521389798 execution_time [52.195µs; 52.226µs] or [-0.030%; +0.030%] None None None
credit_card/is_card_number_no_luhn/37828224631000521389798 throughput [19147518.163op/s; 19158997.679op/s] or [-0.030%; +0.030%] None None None
credit_card/is_card_number_no_luhn/x371413321323331 execution_time [6.632µs; 6.649µs] or [-0.126%; +0.126%] None None None
credit_card/is_card_number_no_luhn/x371413321323331 throughput [150413764.982op/s; 150794121.862op/s] or [-0.126%; +0.126%] None None None

Group 2

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
ip_address/quantize_peer_ip_address_benchmark execution_time 4.946µs 5.010µs ± 0.039µs 5.011µs ± 0.039µs 5.050µs 5.072µs 5.078µs 5.081µs 1.40% 0.211 -1.392 0.78% 0.003µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
ip_address/quantize_peer_ip_address_benchmark execution_time [5.004µs; 5.015µs] or [-0.109%; +0.109%] None None None

Group 3

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... execution_time 208.807µs 209.168µs ± 0.151µs 209.158µs ± 0.101µs 209.263µs 209.406µs 209.548µs 209.723µs 0.27% 0.411 0.480 0.07% 0.011µs 1 200
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... throughput 4768191.079op/s 4780856.208op/s ± 3461.529op/s 4781084.119op/s ± 2301.104op/s 4783289.101op/s 4786159.257op/s 4787417.337op/s 4789118.484op/s 0.17% -0.406 0.471 0.07% 244.767op/s 1 200
normalization/normalize_name/normalize_name/bad-name execution_time 18.227µs 18.317µs ± 0.044µs 18.314µs ± 0.032µs 18.348µs 18.390µs 18.415µs 18.440µs 0.69% 0.134 -0.438 0.24% 0.003µs 1 200
normalization/normalize_name/normalize_name/bad-name throughput 54230824.618op/s 54594998.308op/s ± 130617.819op/s 54602371.992op/s ± 96441.643op/s 54691282.664op/s 54817214.761op/s 54824202.452op/s 54864726.177op/s 0.48% -0.123 -0.445 0.24% 9236.075op/s 1 200
normalization/normalize_name/normalize_name/good execution_time 10.651µs 10.717µs ± 0.027µs 10.715µs ± 0.017µs 10.735µs 10.764µs 10.790µs 10.797µs 0.76% 0.385 0.364 0.25% 0.002µs 1 200
normalization/normalize_name/normalize_name/good throughput 92618913.780op/s 93312504.948op/s ± 233739.126op/s 93325671.068op/s ± 146686.819op/s 93464864.781op/s 93676227.756op/s 93793725.007op/s 93891084.897op/s 0.61% -0.368 0.346 0.25% 16527.852op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... execution_time [209.147µs; 209.189µs] or [-0.010%; +0.010%] None None None
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... throughput [4780376.473op/s; 4781335.943op/s] or [-0.010%; +0.010%] None None None
normalization/normalize_name/normalize_name/bad-name execution_time [18.311µs; 18.323µs] or [-0.033%; +0.033%] None None None
normalization/normalize_name/normalize_name/bad-name throughput [54576895.935op/s; 54613100.682op/s] or [-0.033%; +0.033%] None None None
normalization/normalize_name/normalize_name/good execution_time [10.713µs; 10.720µs] or [-0.035%; +0.035%] None None None
normalization/normalize_name/normalize_name/good throughput [93280110.953op/s; 93344898.943op/s] or [-0.035%; +0.035%] None None None

Group 4

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
write only interface execution_time 1.201µs 3.172µs ± 1.429µs 2.983µs ± 0.030µs 3.010µs 3.602µs 13.960µs 14.932µs 400.58% 7.425 55.978 44.96% 0.101µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
write only interface execution_time [2.973µs; 3.370µs] or [-6.246%; +6.246%] None None None

Group 5

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching deserializing traces from msgpack to their internal representation execution_time 55.014ms 55.361ms ± 0.292ms 55.264ms ± 0.166ms 55.499ms 55.957ms 56.209ms 56.424ms 2.10% 1.110 0.661 0.53% 0.021ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching deserializing traces from msgpack to their internal representation execution_time [55.320ms; 55.401ms] or [-0.073%; +0.073%] None None None

Group 6

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
redis/obfuscate_redis_string execution_time 32.631µs 33.679µs ± 1.401µs 32.784µs ± 0.066µs 35.531µs 36.115µs 36.237µs 36.379µs 10.97% 0.926 -1.070 4.15% 0.099µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
redis/obfuscate_redis_string execution_time [33.485µs; 33.873µs] or [-0.577%; +0.577%] None None None

Group 7

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... execution_time 504.710µs 505.659µs ± 0.387µs 505.678µs ± 0.221µs 505.883µs 506.262µs 506.590µs 506.773µs 0.22% -0.016 0.292 0.08% 0.027µs 1 200
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... throughput 1973271.814op/s 1977616.563op/s ± 1514.590op/s 1977541.935op/s ± 862.036op/s 1978496.872op/s 1980342.406op/s 1981114.382op/s 1981335.162op/s 0.19% 0.021 0.290 0.08% 107.098op/s 1 200
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて execution_time 461.104µs 462.062µs ± 0.292µs 462.055µs ± 0.140µs 462.208µs 462.560µs 462.950µs 463.000µs 0.20% 0.168 1.425 0.06% 0.021µs 1 200
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて throughput 2159828.196op/s 2164212.034op/s ± 1369.419op/s 2164244.270op/s ± 657.242op/s 2164875.432op/s 2166357.229op/s 2167745.859op/s 2168707.154op/s 0.21% -0.162 1.423 0.06% 96.833op/s 1 200
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters execution_time 174.552µs 176.348µs ± 0.413µs 176.397µs ± 0.272µs 176.625µs 176.902µs 177.122µs 177.274µs 0.50% -0.702 1.199 0.23% 0.029µs 1 200
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters throughput 5640987.470op/s 5670634.340op/s ± 13317.700op/s 5669042.022op/s ± 8755.829op/s 5678585.811op/s 5694246.531op/s 5706894.288op/s 5728959.836op/s 1.06% 0.721 1.260 0.23% 941.704op/s 1 200
normalization/normalize_service/normalize_service/[empty string] execution_time 37.598µs 37.695µs ± 0.046µs 37.693µs ± 0.031µs 37.726µs 37.779µs 37.800µs 37.848µs 0.41% 0.369 -0.141 0.12% 0.003µs 1 200
normalization/normalize_service/normalize_service/[empty string] throughput 26421818.374op/s 26528569.718op/s ± 32582.580op/s 26530367.035op/s ± 22139.204op/s 26552095.653op/s 26579079.435op/s 26593164.802op/s 26596860.925op/s 0.25% -0.363 -0.149 0.12% 2303.936op/s 1 200
normalization/normalize_service/normalize_service/test_ASCII execution_time 48.095µs 48.325µs ± 0.229µs 48.217µs ± 0.116µs 48.547µs 48.669µs 48.761µs 48.835µs 1.28% 0.344 -1.528 0.47% 0.016µs 1 200
normalization/normalize_service/normalize_service/test_ASCII throughput 20477075.352op/s 20693632.709op/s ± 98028.147op/s 20739526.688op/s ± 49997.771op/s 20786304.795op/s 20788886.855op/s 20790957.335op/s 20792286.656op/s 0.25% -0.339 -1.537 0.47% 6931.637op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... execution_time [505.606µs; 505.713µs] or [-0.011%; +0.011%] None None None
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... throughput [1977406.655op/s; 1977826.470op/s] or [-0.011%; +0.011%] None None None
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて execution_time [462.022µs; 462.103µs] or [-0.009%; +0.009%] None None None
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて throughput [2164022.246op/s; 2164401.823op/s] or [-0.009%; +0.009%] None None None
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters execution_time [176.291µs; 176.405µs] or [-0.032%; +0.032%] None None None
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters throughput [5668788.635op/s; 5672480.045op/s] or [-0.033%; +0.033%] None None None
normalization/normalize_service/normalize_service/[empty string] execution_time [37.689µs; 37.702µs] or [-0.017%; +0.017%] None None None
normalization/normalize_service/normalize_service/[empty string] throughput [26524054.086op/s; 26533085.350op/s] or [-0.017%; +0.017%] None None None
normalization/normalize_service/normalize_service/test_ASCII execution_time [48.293µs; 48.357µs] or [-0.066%; +0.066%] None None None
normalization/normalize_service/normalize_service/test_ASCII throughput [20680046.950op/s; 20707218.467op/s] or [-0.066%; +0.066%] None None None

Group 8

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
tags/replace_trace_tags execution_time 2.393µs 2.422µs ± 0.026µs 2.413µs ± 0.007µs 2.425µs 2.494µs 2.503µs 2.511µs 4.09% 1.945 3.104 1.07% 0.002µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
tags/replace_trace_tags execution_time [2.418µs; 2.425µs] or [-0.148%; +0.148%] None None None

Group 9

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
two way interface execution_time 17.562µs 25.271µs ± 10.236µs 17.837µs ± 0.224µs 34.838µs 42.809µs 44.603µs 72.895µs 308.68% 1.213 1.631 40.40% 0.724µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
two way interface execution_time [23.852µs; 26.690µs] or [-5.614%; +5.614%] None None None

Group 10

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching string interning on wordpress profile execution_time 149.301µs 150.294µs ± 0.364µs 150.270µs ± 0.142µs 150.425µs 150.681µs 151.051µs 153.798µs 2.35% 4.561 42.473 0.24% 0.026µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching string interning on wordpress profile execution_time [150.244µs; 150.345µs] or [-0.034%; +0.034%] None None None

Group 11

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_trace/test_trace execution_time 245.443ns 254.895ns ± 10.321ns 250.511ns ± 3.885ns 258.024ns 278.775ns 280.892ns 281.717ns 12.46% 1.246 0.299 4.04% 0.730ns 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_trace/test_trace execution_time [253.465ns; 256.325ns] or [-0.561%; +0.561%] None None None

Group 12

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
concentrator/add_spans_to_concentrator execution_time 6.014ms 6.025ms ± 0.010ms 6.024ms ± 0.003ms 6.027ms 6.032ms 6.054ms 6.145ms 2.00% 8.957 102.179 0.17% 0.001ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
concentrator/add_spans_to_concentrator execution_time [6.024ms; 6.027ms] or [-0.023%; +0.023%] None None None

Group 13

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz c2216f2 1740610274 ekump/APMSP-1756-add-trace-exporter-integration-tests
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
sql/obfuscate_sql_string execution_time 68.576µs 68.810µs ± 0.209µs 68.778µs ± 0.066µs 68.853µs 68.987µs 69.330µs 71.121µs 3.41% 7.334 74.211 0.30% 0.015µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
sql/obfuscate_sql_string execution_time [68.781µs; 68.839µs] or [-0.042%; +0.042%] None None None

Baseline

Omitted due to size.

@ekump ekump force-pushed the ekump/APMSP-1756-add-trace-exporter-integration-tests branch 3 times, most recently from a3c1e84 to 4a98617 Compare February 25, 2025 22:33
@codecov-commenter
Copy link

codecov-commenter commented Feb 25, 2025

Codecov Report

Attention: Patch coverage is 95.83333% with 5 lines in your changes missing coverage. Please review.

Project coverage is 71.77%. Comparing base (b145b2f) to head (c2216f2).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #897      +/-   ##
==========================================
+ Coverage   71.71%   71.77%   +0.05%     
==========================================
  Files         328      328              
  Lines       48615    48702      +87     
==========================================
+ Hits        34866    34954      +88     
+ Misses      13749    13748       -1     
Components Coverage Δ
crashtracker 42.87% <ø> (ø)
crashtracker-ffi 6.25% <ø> (ø)
datadog-alloc 98.73% <ø> (ø)
data-pipeline 92.21% <100.00%> (+0.18%) ⬆️
data-pipeline-ffi 90.39% <ø> (ø)
ddcommon 80.08% <ø> (ø)
ddcommon-ffi 61.05% <ø> (ø)
ddtelemetry 61.74% <ø> (ø)
ddtelemetry-ffi 22.46% <ø> (ø)
dogstatsd 90.16% <50.00%> (ø)
dogstatsd-client 82.57% <50.00%> (ø)
ipc 82.63% <ø> (ø)
profiling 80.04% <ø> (ø)
profiling-ffi 70.68% <ø> (ø)
serverless 0.00% <ø> (ø)
sidecar 40.23% <ø> (-0.06%) ⬇️
sidecar-ffi 0.14% <ø> (-0.45%) ⬇️
spawn-worker 54.37% <ø> (ø)
tinybytes 92.00% <ø> (ø)
trace-mini-agent 72.48% <100.00%> (ø)
trace-normalization 98.23% <ø> (ø)
trace-obfuscation 95.96% <ø> (ø)
trace-protobuf 78.13% <ø> (ø)
trace-utils 93.29% <95.69%> (+0.02%) ⬆️

@ekump ekump marked this pull request as ready for review February 25, 2025 22:48
@ekump ekump requested review from a team as code owners February 25, 2025 22:48
"runtime-id": "test-runtime-id-value",
"service": "test-service"
},
"metrics": {}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/question

is it expected that when there are no metrics, we are still serializing the metrics?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have been following what is in the proto definitions for what to skip serializing, which currently does not skip metrics.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the link you shared

    /// metrics is a mapping from tag name to tag value for numeric-valued tags.
    /// @gotags: json:"metrics,omitempty" msg:"metrics,omitempty"
    #[prost(map = "string, double", tag = "11")]
    #[serde(default)]
    #[serde(deserialize_with = "deserialize_null_into_default")]
    pub metrics: ::std::collections::HashMap<::prost::alloc::string::String, f64>,

says omitempty which means this should be omitted if empty per https://pkg.go.dev/encoding/json

or did I miss anything? 🤔

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no #[serde(skip_serializing_if = "::std::collections::HashMap::is_empty")] attribute on the field.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Closing the loop on this after discussing IRL. We are following the spec and not serializing empty metric fields, which is tested here, and I manually confirmed, so we are serializing as expected.

The snapshot validation on the test-agent side appears to not raise an error in the scenario for "omit if empty" fields where they are correctly omitted in the payload and the key with an empty value is included in the snapshot json. I updated our snapshots to remove potential future confusion.

// This function is only intended for testing purposes so we don't need to go to all the trouble
// of breaking the uri down and parsing it as rigorously as we would if we were using it in
// production code.
fn add_query(&self, url: &Uri, query: &str) -> Uri {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/suggestion

as you mentioned that this is for testing only, can this be moved out?

so we don't end up using in prod code accidentally?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's behind the test-utils feature so it won't be included in production code.

@@ -32481,6 +32481,33 @@ third_party_libraries:
DEALINGS IN THE SOFTWARE.
- license: Apache-2.0
text: " Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n\thttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
- package_name: urlencoding
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/question

what is our policy on using the dependencies?

It looks like this crate is managed by some independent developer which seems risky.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are policies against libraries with certain licenses, but there is no policy against using libraries from independent developers. We use many libraries from independent open source maintainers. urlencoding is fairly popular.


let span_2 = create_test_no_alloc_span(1234, 12343, 12341, 1, false);
let mut span_1 = create_test_json_span(1234, 12342, 12341, 1, false);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you need json span here ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need json span's here, it just requires a bit less code to manipulate the spans to set them up for the test (see the metrics hashmap as an example). The spans are getting converted to msgpack anyway, so I don't think it makes much of a difference? We can switch back if you disagree.

@ekump ekump force-pushed the ekump/APMSP-1756-add-trace-exporter-integration-tests branch from 4a98617 to 96a6742 Compare February 26, 2025 16:28
@ekump ekump force-pushed the ekump/APMSP-1756-add-trace-exporter-integration-tests branch from 96a6742 to c2216f2 Compare February 26, 2025 22:51
@ekump ekump enabled auto-merge (squash) February 26, 2025 22:54
@ekump ekump merged commit a1d958b into main Feb 26, 2025
31 checks passed
@ekump ekump deleted the ekump/APMSP-1756-add-trace-exporter-integration-tests branch February 26, 2025 23:24
morrisonlevi pushed a commit that referenced this pull request Feb 27, 2025
- APMSP-1756 add initial integration tests for trace exporter
- APMSP-1779 add span deserialization and Payload collection construction to send data integration tests
- Return the offending key in the error message when decoding v04 msgpack spans and we encounter an invalid key
- Fix confusing var name in dogstatsd client from PR #890
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants