You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by le...@apache.org on 2023/08/25 07:43:25 UTC

[apisix] branch master updated: feat: replace mock tests with real tests in opentelemetry plugin (#9983)

This is an automated email from the ASF dual-hosted git repository.

leslie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 89c185866 feat: replace mock tests with real tests in opentelemetry plugin (#9983)
89c185866 is described below

commit 89c1858662e34c76de01c84b665c79fcb2edaeb8
Author: Ashish Tiwari <as...@gmail.com>
AuthorDate: Fri Aug 25 13:13:18 2023 +0530

    feat: replace mock tests with real tests in opentelemetry plugin (#9983)
---
 Makefile                                           |   4 +
 ci/pod/docker-compose.plugin.yml                   |   7 +
 ci/pod/otelcol-contrib/config.yaml                 |  30 ++
 t/plugin/opentelemetry.t                           | 459 ++++-----------------
 t/plugin/opentelemetry2.t                          | 121 +-----
 ...pb-state.t => opentelemetry4-bugfix-pb-state.t} |  45 +-
 6 files changed, 134 insertions(+), 532 deletions(-)

diff --git a/Makefile b/Makefile
index c6979cd6f..d30bd8ab9 100644
--- a/Makefile
+++ b/Makefile
@@ -26,6 +26,7 @@ VERSION                ?= master
 project_name           ?= apache-apisix
 project_release_name   ?= $(project_name)-$(VERSION)-src
 
+OTEL_CONFIG ?= ./ci/pod/otelcol-contrib/data-otlp.json
 
 # Hyperconverged Infrastructure
 ENV_OS_NAME            ?= $(shell uname -s | tr '[:upper:]' '[:lower:]')
@@ -450,6 +451,8 @@ compress-tar:
 .PHONY: ci-env-up
 ci-env-up:
 	@$(call func_echo_status, "$@ -> [ Start ]")
+	touch $(OTEL_CONFIG)
+	chmod 777 $(OTEL_CONFIG)
 	$(ENV_DOCKER_COMPOSE) up -d
 	@$(call func_echo_success_status, "$@ -> [ Done ]")
 
@@ -474,5 +477,6 @@ ci-env-rebuild:
 .PHONY: ci-env-down
 ci-env-down:
 	@$(call func_echo_status, "$@ -> [ Start ]")
+	rm $(OTEL_CONFIG)
 	$(ENV_DOCKER_COMPOSE) down
 	@$(call func_echo_success_status, "$@ -> [ Done ]")
diff --git a/ci/pod/docker-compose.plugin.yml b/ci/pod/docker-compose.plugin.yml
index 4ea069b8c..748b28b86 100644
--- a/ci/pod/docker-compose.plugin.yml
+++ b/ci/pod/docker-compose.plugin.yml
@@ -341,6 +341,13 @@ services:
       - '8124:8123'
     networks:
       clickhouse_net:
+  otel-collector:
+    image: otel/opentelemetry-collector-contrib
+    volumes:
+    - ./ci/pod/otelcol-contrib:/etc/otelcol-contrib:rw
+    ports:
+      - '4318:4318'
+
 
 networks:
   apisix_net:
diff --git a/ci/pod/otelcol-contrib/config.yaml b/ci/pod/otelcol-contrib/config.yaml
new file mode 100644
index 000000000..438f04c8b
--- /dev/null
+++ b/ci/pod/otelcol-contrib/config.yaml
@@ -0,0 +1,30 @@
+#
+# 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.
+#
+
+receivers:
+  otlp:
+    protocols:
+      grpc:
+      http:
+exporters:
+  file:
+    path: /etc/otelcol-contrib/data-otlp.json
+service:
+  pipelines:
+    traces:
+      receivers: [otlp]
+      exporters: [file]
diff --git a/t/plugin/opentelemetry.t b/t/plugin/opentelemetry.t
index 5adc158e9..f9e64853d 100644
--- a/t/plugin/opentelemetry.t
+++ b/t/plugin/opentelemetry.t
@@ -16,7 +16,6 @@
 #
 
 use t::APISIX 'no_plan';
-
 add_block_preprocessor(sub {
     my ($block) = @_;
 
@@ -26,38 +25,23 @@ plugins:
     - opentelemetry
 plugin_attr:
     opentelemetry:
+        trace_id_source: x-request-id
         batch_span_processor:
             max_export_batch_size: 1
             inactive_timeout: 0.5
+        collector:
+            address: 127.0.0.1:4318
+            request_timeout: 3
+            request_headers:
+                foo: bar
 _EOC_
         $block->set_value("extra_yaml_config", $extra_yaml_config);
     }
-
-
-    if (!$block->extra_init_by_lua) {
-        my $extra_init_by_lua = <<_EOC_;
--- mock exporter http client
-local client = require("opentelemetry.trace.exporter.http_client")
-client.do_request = function()
-    ngx.log(ngx.INFO, "opentelemetry export span")
-    return "ok"
-end
-_EOC_
-
-        $block->set_value("extra_init_by_lua", $extra_init_by_lua);
-    }
-
-    if (!$block->request) {
-        $block->set_value("request", "GET /t");
-    }
-
     if (!defined $block->response_body) {
         $block->set_value("response_body", "passed\n");
     }
-
     $block;
 });
-
 repeat_each(1);
 no_long_string();
 no_root_location();
@@ -98,110 +82,29 @@ __DATA__
             ngx.say(body)
         }
     }
+--- request
+GET /t
 
 
 
 === TEST 2: trigger opentelemetry
 --- request
 GET /opentracing
+--- wait: 2
 --- response_body
 opentracing
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
-
-
-
-=== TEST 3: use default always_off sampler
---- 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,
-                [[{
-                    "plugins": {
-                        "opentelemetry": {
-                        }
-                    },
-                    "upstream": {
-                        "nodes": {
-                            "127.0.0.1:1980": 1
-                        },
-                        "type": "roundrobin"
-                    },
-                    "uri": "/opentracing"
-                }]]
-                )
 
-            if code >= 300 then
-                ngx.status = code
-            end
-            ngx.say(body)
-        }
-    }
 
 
-
-=== TEST 4: not trigger opentelemetry
---- request
-GET /opentracing
---- response_body
-opentracing
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
+=== TEST 3: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*opentelemetry-lua.*/
 
 
 
-=== TEST 5: use trace_id_ratio sampler, default fraction = 0
---- 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,
-                [[{
-                    "plugins": {
-                        "opentelemetry": {
-                            "sampler": {
-                                "name": "trace_id_ratio"
-                            }
-                        }
-                    },
-                    "upstream": {
-                        "nodes": {
-                            "127.0.0.1:1980": 1
-                        },
-                        "type": "roundrobin"
-                    },
-                    "uri": "/opentracing"
-                }]]
-                )
-
-            if code >= 300 then
-                ngx.status = code
-            end
-            ngx.say(body)
-        }
-    }
-
-
-
-=== TEST 6: not trigger opentelemetry
---- request
-GET /opentracing
---- response_body
-opentracing
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-
-
-
-=== TEST 7: use trace_id_ratio sampler, fraction = 1.0
+=== TEST 4: use trace_id_ratio sampler, fraction = 1.0
 --- config
     location /t {
         content_by_lua_block {
@@ -235,120 +138,29 @@ qr/opentelemetry export span/
             ngx.say(body)
         }
     }
-
-
-
-=== TEST 8: trigger opentelemetry
 --- request
-GET /opentracing
---- response_body
-opentracing
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
-
-
-
-=== TEST 9: use parent_base sampler, default root sampler = always_off
---- 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,
-                [[{
-                    "plugins": {
-                        "opentelemetry": {
-                            "sampler": {
-                                "name": "parent_base"
-                            }
-                        }
-                    },
-                    "upstream": {
-                        "nodes": {
-                            "127.0.0.1:1980": 1
-                        },
-                        "type": "roundrobin"
-                    },
-                    "uri": "/opentracing"
-                }]]
-                )
+GET /t
 
-            if code >= 300 then
-                ngx.status = code
-            end
-            ngx.say(body)
-        }
-    }
 
 
-
-=== TEST 10: not trigger opentelemetry
+=== TEST 5: trigger opentelemetry
 --- request
 GET /opentracing
+--- wait: 2
 --- response_body
 opentracing
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-
 
 
-=== TEST 11: use parent_base sampler, root sampler = always_on
---- 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,
-                [[{
-                    "plugins": {
-                        "opentelemetry": {
-                            "sampler": {
-                                "name": "parent_base",
-                                "options": {
-                                    "root": {
-                                        "name": "always_on"
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    "upstream": {
-                        "nodes": {
-                            "127.0.0.1:1980": 1
-                        },
-                        "type": "roundrobin"
-                    },
-                    "uri": "/opentracing"
-                }]]
-                )
 
-            if code >= 300 then
-                ngx.status = code
-            end
-            ngx.say(body)
-        }
-    }
+=== TEST 6: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*opentelemetry-lua.*/
 
 
 
-=== TEST 12: trigger opentelemetry
---- request
-GET /opentracing
---- response_body
-opentracing
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
-
-
-
-=== TEST 13: use parent_base sampler, root sampler = trace_id_ratio with default fraction = 0
+=== TEST 7: use parent_base sampler, root sampler = trace_id_ratio with default fraction = 0
 --- config
     location /t {
         content_by_lua_block {
@@ -384,36 +196,31 @@ opentelemetry export span
             ngx.say(body)
         }
     }
-
-
-
-=== TEST 14: not trigger opentelemetry
 --- request
-GET /opentracing
---- response_body
-opentracing
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
+GET /t
 
 
 
-=== TEST 15: trigger opentelemetry, trace_flag = 1
+=== TEST 8: trigger opentelemetry, trace_flag = 1
 --- request
 GET /opentracing
 --- more_headers
 traceparent: 00-00000000000000000000000000000001-0000000000000001-01
+--- wait: 2
 --- response_body
 opentracing
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
 
 
 
-=== TEST 16: use parent_base sampler, root sampler = trace_id_ratio with fraction = 1
+=== TEST 9: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*"traceId":"00000000000000000000000000000001",.*/
+
+
+
+=== TEST 10: use parent_base sampler, root sampler = trace_id_ratio with fraction = 1
 --- config
     location /t {
         content_by_lua_block {
@@ -452,36 +259,31 @@ opentelemetry export span
             ngx.say(body)
         }
     }
+--- request
+GET /t
 
 
 
-=== TEST 17: trigger opentelemetry
+=== TEST 11: trigger opentelemetry, trace_flag = 1
 --- request
 GET /opentracing
+--- more_headers
+traceparent: 00-00000000000000000000000000000001-0000000000000001-01
+--- wait: 2
 --- response_body
 opentracing
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
 
 
 
-=== TEST 18: not trigger opentelemetry, trace_flag = 0
---- request
-GET /opentracing
---- more_headers
-traceparent: 00-00000000000000000000000000000001-0000000000000001-00
---- response_body
-opentracing
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
+=== TEST 12: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*"traceId":"00000000000000000000000000000001",.*/
 
 
 
-=== TEST 19: set additional_attributes
+=== TEST 13: set additional_attributes
 --- config
     location /t {
         content_by_lua_block {
@@ -531,122 +333,38 @@ qr/opentelemetry export span/
             ngx.say(body)
         }
     }
+--- request
+GET /t
 
 
 
-=== TEST 20: trigger opentelemetry, test trace_id_source=x-request-id, custom resource, additional_attributes
---- extra_yaml_config
-plugins:
-    - opentelemetry
-plugin_attr:
-    opentelemetry:
-        trace_id_source: x-request-id
-        resource:
-            service.name: test
-            test_key: test_val
-        batch_span_processor:
-            max_export_batch_size: 1
-            inactive_timeout: 0.5
---- extra_init_by_lua
-    local core = require("apisix.core")
-    local otlp = require("opentelemetry.trace.exporter.otlp")
-    local span_kind = require("opentelemetry.trace.span_kind")
-    otlp.export_spans = function(self, spans)
-        if (#spans ~= 1) then
-            ngx.log(ngx.ERR, "unexpected spans length: ", #spans)
-            return
-        end
-
-        local span = spans[1]
-        if span:context().trace_id ~= "01010101010101010101010101010101" then
-            ngx.log(ngx.ERR, "unexpected trace id: ", span:context().trace_id)
-            return
-        end
-
-        local current_span_kind = span:plain().kind
-        if current_span_kind ~= span_kind.server then
-            ngx.log(ngx.ERR, "expected span.kind to be server but got ", current_span_kind)
-            return
-        end
-
-        if span.name ~= "/opentracing?foo=bar&a=b" then
-            ngx.log(ngx.ERR, "expect span name: /opentracing?foo=bar&a=b, but got ", span.name)
-            return
-        end
-
-        local expected_resource_attrs = {
-            test_key = "test_val",
-        }
-        expected_resource_attrs["service.name"] = "test"
-        expected_resource_attrs["telemetry.sdk.language"] = "lua"
-        expected_resource_attrs["telemetry.sdk.name"] = "opentelemetry-lua"
-        expected_resource_attrs["telemetry.sdk.version"] = "0.1.1"
-        expected_resource_attrs["hostname"] = core.utils.gethostname()
-        local actual_resource_attrs = span.tracer.provider.resource:attributes()
-        if #actual_resource_attrs ~= 6 then
-            ngx.log(ngx.ERR, "expect len(actual_resource) = 6, but got ", #actual_resource_attrs)
-            return
-        end
-        for _, attr in ipairs(actual_resource_attrs) do
-            local expected_val = expected_resource_attrs[attr.key]
-            if not expected_val then
-                ngx.log(ngx.ERR, "unexpected resource attr key: ", attr.key)
-                return
-            end
-            if attr.value.string_value ~= expected_val then
-                ngx.log(ngx.ERR, "unexpected resource attr val: ", attr.value.string_value)
-                return
-            end
-        end
-
-        local expected_attributes = {
-            service = "service_name",
-            route = "route_name",
-            http_user_agent = "test_nginx",
-            arg_foo = "bar",
-            cookie_token = "auth_token",
-            remote_addr = "127.0.0.1",
-        }
-        if #span.attributes ~= 6 then
-            ngx.log(ngx.ERR, "expect len(span.attributes) = 6, but got ", #span.attributes)
-            return
-        end
-        for _, attr in ipairs(span.attributes) do
-            local expected_val = expected_attributes[attr.key]
-            if not expected_val then
-                ngx.log(ngx.ERR, "unexpected attr key: ", attr.key)
-                return
-            end
-            if attr.value.string_value ~= expected_val then
-                ngx.log(ngx.ERR, "unexpected attr val: ", attr.value.string_value)
-                return
-            end
-        end
-
-        ngx.log(ngx.INFO, "opentelemetry export span")
-    end
+=== TEST 14: trigger opentelemetry
 --- request
 GET /opentracing?foo=bar&a=b
 --- more_headers
 X-Request-Id: 01010101010101010101010101010101
 User-Agent: test_nginx
 Cookie: token=auth_token;
+--- wait: 2
 --- response_body
 opentracing
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
 
 
 
-=== TEST 21: create route for /specific_status
+=== TEST 15: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*\/opentracing\?foo=bar.*/
+
+
+
+=== TEST 16: create route for /specific_status
 --- config
     location /t {
         content_by_lua_block {
             local t = require("lib.test_admin").test
-            local code, body = t('/apisix/admin/routes/2',
+            local code, body = t('/apisix/admin/routes/1',
                 ngx.HTTP_PUT,
                 [[{
                     "name": "route_name",
@@ -673,54 +391,21 @@ opentelemetry export span
             ngx.say(body)
         }
     }
+--- request
+GET /t
 
 
 
-=== TEST 22: 500 status, test span.status
---- extra_init_by_lua
-    local otlp = require("opentelemetry.trace.exporter.otlp")
-    otlp.export_spans = function(self, spans)
-        if (#spans ~= 1) then
-            ngx.log(ngx.ERR, "unexpected spans length: ", #spans)
-            return
-        end
-
-        local span = spans[1]
-        if span.status.code ~= 2 then
-            ngx.log(ngx.ERR, "unexpected status.code: ", span.status.code)
-        end
-        if span.status.message ~= "upstream response status: 500" then
-            ngx.log(ngx.ERR, "unexpected status.message: ", span.status.message)
-        end
-
-        ngx.log(ngx.INFO, "opentelemetry export span")
-    end
+=== TEST 17: test response empty body
 --- request
-GET /specific_status
---- more_headers
-X-Test-Upstream-Status: 500
---- error_code: 500
+HEAD /specific_status
 --- response_body
-upstream status: 500
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
+--- wait: 2
 
 
 
-=== TEST 23: test response empty body
---- extra_init_by_lua
-    local otlp = require("opentelemetry.trace.exporter.otlp")
-    otlp.export_spans = function(self, spans)
-        ngx.log(ngx.INFO, "opentelemetry export span")
-    end
---- request
-HEAD /specific_status
---- response_body
---- wait: 1
---- grep_error_log eval
-qr/opentelemetry export span/
---- grep_error_log_out
-opentelemetry export span
+=== TEST 18: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*\/specific_status.*/
diff --git a/t/plugin/opentelemetry2.t b/t/plugin/opentelemetry2.t
index 052cdbc12..3344ce97b 100644
--- a/t/plugin/opentelemetry2.t
+++ b/t/plugin/opentelemetry2.t
@@ -28,6 +28,7 @@ plugins:
     - opentelemetry
 plugin_attr:
     opentelemetry:
+        trace_id_source: x-request-id
         batch_span_processor:
             max_export_batch_size: 1
             inactive_timeout: 0.5
@@ -35,30 +36,6 @@ _EOC_
         $block->set_value("extra_yaml_config", $extra_yaml_config);
     }
 
-
-    if (!$block->extra_init_by_lua) {
-        my $extra_init_by_lua = <<_EOC_;
--- mock exporter http client
-local client = require("opentelemetry.trace.exporter.http_client")
-client.do_request = function()
-    ngx.log(ngx.INFO, "opentelemetry export span")
-    return "ok"
-end
-local ctx_new = require("opentelemetry.context").new
-require("opentelemetry.context").new = function (...)
-    local ctx = ctx_new(...)
-    local current = ctx.current
-    ctx.current = function (...)
-        ngx.log(ngx.INFO, "opentelemetry context current")
-        return current(...)
-    end
-    return ctx
-end
-_EOC_
-
-        $block->set_value("extra_init_by_lua", $extra_init_by_lua);
-    }
-
     if (!$block->request) {
         $block->set_value("request", "GET /t");
     }
@@ -130,96 +107,12 @@ passed
 --- request
 GET /hello
 --- error_code: 401
---- wait: 1
---- grep_error_log eval
-qr/(opentelemetry export span|opentelemetry context current|plugin body_filter phase)/
---- grep_error_log_out
-plugin body_filter phase
-plugin body_filter phase
-opentelemetry context current
-opentelemetry export span
+--- wait: 2
 
 
 
-=== TEST 3: set additional_attributes with match
---- 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,
-                [[{
-                    "name": "route_name",
-                    "plugins": {
-                        "opentelemetry": {
-                            "sampler": {
-                                "name": "always_on"
-                            },
-                            "additional_header_prefix_attributes": [
-                                "x-my-header-*"
-                            ]
-                        }
-                    },
-                    "upstream": {
-                        "nodes": {
-                            "127.0.0.1:1980": 1
-                        },
-                        "type": "roundrobin"
-                    },
-                    "uri": "/attributes"
-                }]]
-                )
-
-            if code >= 300 then
-                ngx.status = code
-            end
-            ngx.say(body)
-        }
-    }
---- response_body
-passed
-
-
-
-=== TEST 4: opentelemetry expands headers
---- extra_init_by_lua
-    local otlp = require("opentelemetry.trace.exporter.otlp")
-    otlp.export_spans = function(self, spans)
-        if (#spans ~= 1) then
-            ngx.log(ngx.ERR, "unexpected spans length: ", #spans)
-            return
-        end
-
-        local attributes_names = {}
-        local attributes = {}
-        local span = spans[1]
-        for _, attribute in ipairs(span.attributes) do
-            if attribute.key == "hostname" then
-                -- remove any randomness
-                goto skip
-            end
-            table.insert(attributes_names, attribute.key)
-            attributes[attribute.key] = attribute.value.string_value or ""
-            ::skip::
-        end
-        table.sort(attributes_names)
-        for _, attribute in ipairs(attributes_names) do
-            ngx.log(ngx.INFO, "attribute " .. attribute .. ": \"" .. attributes[attribute] .. "\"")
-        end
-
-        ngx.log(ngx.INFO, "opentelemetry export span")
-    end
---- request
-GET /attributes
---- more_headers
-x-my-header-name: william
-x-my-header-nick: bill
---- wait: 1
---- error_code: 404
---- grep_error_log eval
-qr/attribute .+?:.[^,]*/
---- grep_error_log_out
-attribute route: "route_name"
-attribute service: ""
-attribute x-my-header-name: "william"
-attribute x-my-header-nick: "bill"
+=== TEST 3: check log
+--- exec
+tail -n 1 ci/pod/otelcol-contrib/data-otlp.json
+--- response_body eval
+qr/.*\/hello.*/
diff --git a/t/plugin/opentelemetry-bugfix-pb-state.t b/t/plugin/opentelemetry4-bugfix-pb-state.t
similarity index 86%
rename from t/plugin/opentelemetry-bugfix-pb-state.t
rename to t/plugin/opentelemetry4-bugfix-pb-state.t
index b6f2e1052..5607e912e 100644
--- a/t/plugin/opentelemetry-bugfix-pb-state.t
+++ b/t/plugin/opentelemetry4-bugfix-pb-state.t
@@ -16,55 +16,34 @@
 #
 
 use t::APISIX 'no_plan';
-
 add_block_preprocessor(sub {
     my ($block) = @_;
 
     if (!$block->extra_yaml_config) {
         my $extra_yaml_config = <<_EOC_;
 plugins:
-    - example-plugin
-    - key-auth
     - opentelemetry
 plugin_attr:
     opentelemetry:
+        trace_id_source: x-request-id
         batch_span_processor:
             max_export_batch_size: 1
             inactive_timeout: 0.5
+        collector:
+            address: 127.0.0.1:4318
+            request_timeout: 3
+            request_headers:
+                foo: bar
 _EOC_
         $block->set_value("extra_yaml_config", $extra_yaml_config);
     }
 
-
-    if (!$block->extra_init_by_lua) {
-        my $extra_init_by_lua = <<_EOC_;
--- mock exporter http client
-local client = require("opentelemetry.trace.exporter.http_client")
-client.do_request = function()
-    ngx.log(ngx.INFO, "opentelemetry export span")
-    return "ok"
-end
-local ctx_new = require("opentelemetry.context").new
-require("opentelemetry.context").new = function (...)
-    local ctx = ctx_new(...)
-    local current = ctx.current
-    ctx.current = function (...)
-        ngx.log(ngx.INFO, "opentelemetry context current")
-        return current(...)
-    end
-    return ctx
-end
-_EOC_
-
-        $block->set_value("extra_init_by_lua", $extra_init_by_lua);
-    }
-
-    if (!$block->request) {
-        $block->set_value("request", "GET /t");
-    }
-
     $block;
 });
+repeat_each(1);
+no_long_string();
+no_root_location();
+log_level("debug");
 
 run_tests;
 
@@ -105,6 +84,8 @@ __DATA__
             ngx.say(body)
         }
     }
+--- request
+GET /t
 --- response_body
 passed
 
@@ -179,6 +160,8 @@ passed
             ngx.status = res.status
         }
     }
+--- request
+GET /t
 --- wait: 1
 --- error_code: 200
 --- no_error_log