Copilot commented on code in PR #13232:
URL: https://github.com/apache/apisix/pull/13232#discussion_r3151143517


##########
t/plugin/opentelemetry6.t:
##########
@@ -248,3 +241,56 @@ opentracing
             end
         }
     }
+
+
+
+=== TEST 7: clear file
+--- exec
+echo '' > ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr//
+
+
+
+=== TEST 8: trigger two concurrent HTTP/2 requests on the same TLS connection
+--- init_by_lua_block
+    require "resty.core"
+    apisix = require("apisix")
+    core = require("apisix.core")
+    apisix.http_init()
+
+    local utils = require("apisix.core.utils")
+    utils.dns_parse = function (domain)
+        if domain == "test1.com" then
+            return {address = "127.0.0.2"}
+        end
+        error("unknown domain: " .. domain)
+    end
+--- exec
+curl -sk --http2 --parallel --resolve "test.com:1994:127.0.0.1" 
https://test.com:1994/opentracing https://test.com:1994/opentracing

Review Comment:
   Using `curl --parallel` makes the test nondeterministic: (1) responses 
written to stdout can be interleaved/concatenated in ways that vary by curl 
version/platform, and (2) curl may open more than one HTTP/2 connection under 
parallel scheduling, undermining the goal of 'same TLS connection' validation. 
For a stable regression, prefer a single curl invocation without `--parallel` 
(still reuses the same HTTP/2 connection sequentially) or write outputs to 
separate files (`--output`) and assert their contents independently.



##########
t/node/tracer.t:
##########
@@ -0,0 +1,105 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+use t::APISIX 'no_plan';
+
+repeat_each(1);
+log_level('debug');
+no_root_location();
+no_shuffle();
+
+add_block_preprocessor(sub {
+    my ($block) = @_;
+
+    if (!$block->extra_yaml_config) {
+        my $extra_yaml_config = <<_EOC_;
+apisix:
+    tracing: true
+_EOC_
+        $block->set_value("extra_yaml_config", $extra_yaml_config);
+    }
+
+    if (!$block->request) {
+        $block->set_value("request", "GET /t");
+    }
+
+    if (!defined $block->response_body) {
+        $block->set_value("response_body", "passed\n");
+    }
+});
+
+run_tests;
+
+__DATA__
+
+=== TEST 1: set SSL cert for test.com
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin")
+            local ssl_cert = t.read_file("t/certs/apisix.crt")
+            local ssl_key = t.read_file("t/certs/apisix.key")
+            local core = require("apisix.core")
+            local data = {cert = ssl_cert, key = ssl_key, sni = "test.com"}
+            local code, body = t.test('/apisix/admin/ssls/1',
+                ngx.HTTP_PUT,
+                core.json.encode(data),
+                [[{
+                    "value": {
+                        "sni": "test.com"
+                    },
+                    "key": "/apisix/ssls/1"
+                }]]
+            )
+            ngx.status = code
+            ngx.say(body)
+        }
+    }
+
+
+
+=== TEST 2: set route
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                ngx.HTTP_PUT,
+                [[{
+                    "upstream": {
+                        "nodes": {
+                            "127.0.0.1:1980": 1
+                        },
+                        "type": "roundrobin"
+                    },
+                    "uri": "/opentracing"
+                }]]
+            )
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+
+
+
+=== TEST 3: consecutive HTTPS keepalive requests do not crash when tracing is 
enabled
+--- exec
+curl -s -k https://test.com:1994/opentracing https://test.com:1994/opentracing

Review Comment:
   This test relies on `test.com` resolving in the test environment. Many CI 
environments won’t have DNS/hosts entries for `test.com`, making the test 
flaky. Use `--resolve \"test.com:1994:127.0.0.1\"` (or the project-standard 
mechanism used in other tests) to ensure the request targets the local APISIX 
instance deterministically.
   ```suggestion
   curl -s -k --resolve "test.com:1994:127.0.0.1" 
https://test.com:1994/opentracing https://test.com:1994/opentracing
   ```



##########
t/lib/test_otel.lua:
##########
@@ -132,4 +132,50 @@ function _M.verify_tree(filepath, expected_tree)
 end
 
 
+function _M.verify_isolated_traces(filepath, root_name, count)
+    local spans_by_id, err = parse_spans(filepath)
+    if not spans_by_id then
+        return false, err
+    end
+
+    local traces = {}
+    for _, span in pairs(spans_by_id) do
+        if not traces[span.traceId] then
+            traces[span.traceId] = {}
+        end
+        table.insert(traces[span.traceId], span.name)
+    end
+
+    local matching = {}
+    for trace_id, names in pairs(traces) do
+        for _, name in ipairs(names) do
+            if name == root_name then
+                table.insert(matching, { id = trace_id, names = names })
+                break
+            end
+        end
+    end
+
+    if #matching ~= count then
+        return false, string.format(
+            "expected %d traces with span '%s', got %d",
+            count, root_name, #matching)
+    end
+
+    for _, trace in ipairs(matching) do
+        local seen = {}
+        for _, name in ipairs(trace.names) do
+            if seen[name] then
+                return false, string.format(
+                    "trace %s has duplicate span '%s': cross-stream 
contamination detected",
+                    trace.id, name)
+            end
+            seen[name] = true
+        end
+    end

Review Comment:
   This asserts that span names are unique within a trace. That’s not a safe 
invariant for tracing systems in general (a single request/trace can 
legitimately contain multiple spans with the same name due to retries, repeated 
phases, or multiple identical sub-operations). This can create false negatives 
unrelated to cross-stream contamination. A more robust check would validate 
isolation using trace structure/relationships (e.g., exactly one root span per 
trace and all descendants linked to it) and/or assert expected span sets/counts 
per trace rather than enforcing global name uniqueness.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to