diff --git a/apisix/plugins/opentelemetry.lua b/apisix/plugins/opentelemetry.lua index 12d61c99fc3b..3ff6315c0f8c 100644 --- a/apisix/plugins/opentelemetry.lua +++ b/apisix/plugins/opentelemetry.lua @@ -176,7 +176,7 @@ local schema = { local _M = { version = 0.1, - priority = -1200, -- last running plugin, but before serverless post func + priority = 12009, name = plugin_name, schema = schema, attr_schema = attr_schema, @@ -306,10 +306,14 @@ function _M.rewrite(conf, api_ctx) end -function _M.body_filter(conf, api_ctx) +function _M.delayed_body_filter(conf, api_ctx) if ngx.arg[2] then - local upstream_status = core.response.get_upstream_status(api_ctx) local ctx = context:current() + if not ctx then + return + end + + local upstream_status = core.response.get_upstream_status(api_ctx) ctx:detach() -- get span from current context diff --git a/apisix/plugins/skywalking.lua b/apisix/plugins/skywalking.lua index ffba5291262b..de170487e0f9 100644 --- a/apisix/plugins/skywalking.lua +++ b/apisix/plugins/skywalking.lua @@ -62,7 +62,7 @@ local schema = { local _M = { version = 0.1, - priority = -1100, -- last running plugin, but before serverless post func + priority = 12010, name = plugin_name, schema = schema, attr_schema = attr_schema, @@ -89,7 +89,7 @@ function _M.rewrite(conf, ctx) end -function _M.body_filter(conf, ctx) +function _M.delayed_body_filter(conf, ctx) if ctx.skywalking_sample and ngx.arg[2] then Span.setComponentId(ngx.ctx.exitSpan, 6002) Span.setComponentId(ngx.ctx.entrySpan, 6002) diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 8d2c7d749908..6a5f8212af6a 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -325,6 +325,8 @@ plugins: # plugin list (sorted by priority) - client-control # priority: 22000 - proxy-control # priority: 21990 - zipkin # priority: 12011 + #- skywalking # priority: 12010 + #- opentelemetry # priority: 12009 - ext-plugin-pre-req # priority: 12000 - request-id # priority: 11010 - fault-injection # priority: 11000 @@ -387,8 +389,6 @@ plugins: # plugin list (sorted by priority) #- log-rotate # priority: 100 # <- recommend to use priority (0, 100) for your custom plugins - example-plugin # priority: 0 - #- skywalking # priority: -1100 - #- opentelemetry # priority: -1200 - aws-lambda # priority: -1899 - azure-functions # priority: -1900 - openwhisk # priority: -1901 diff --git a/t/plugin/opentelemetry2.t b/t/plugin/opentelemetry2.t new file mode 100644 index 000000000000..f173d125ba91 --- /dev/null +++ b/t/plugin/opentelemetry2.t @@ -0,0 +1,144 @@ +# +# 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'; + +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: + batch_span_processor: + max_export_batch_size: 1 + inactive_timeout: 0.5 +_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") +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"); + } + + if (!$block->no_error_log && !$block->error_log) { + $block->set_value("no_error_log", "[error]"); + } + + $block; +}); + +run_tests; + +__DATA__ + +=== TEST 1: trace request rejected by auth +--- config + location /t { + content_by_lua_block { + local t = require("lib.test_admin").test + local code, body = t('/apisix/admin/consumers', + ngx.HTTP_PUT, + [[{ + "username": "jack", + "plugins": { + "key-auth": { + "key": "auth-one" + } + } + }]] + ) + + if code >= 300 then + ngx.status = code + ngx.say(body) + return + end + + local code, body = t('/apisix/admin/routes/1', + ngx.HTTP_PUT, + [[{ + "plugins": { + "key-auth": {}, + "example-plugin": {"i": 1}, + "opentelemetry": { + "sampler": { + "name": "always_on" + } + } + }, + "upstream": { + "nodes": { + "127.0.0.1:1980": 1 + }, + "type": "roundrobin" + }, + "uri": "/hello" + }]] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- response_body +passed + + + +=== TEST 2: trigger opentelemetry +--- 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 context current +opentelemetry export span diff --git a/t/plugin/skywalking.t b/t/plugin/skywalking.t index 565fe32103f1..3f84980eeaec 100644 --- a/t/plugin/skywalking.t +++ b/t/plugin/skywalking.t @@ -22,6 +22,8 @@ add_block_preprocessor(sub { my $extra_yaml_config = <<_EOC_; plugins: + - example-plugin + - key-auth - skywalking _EOC_ @@ -501,3 +503,76 @@ GET /t passed --- no_error_log [error] + + + +=== TEST 14: trace request rejected by auth +--- config + location /t { + content_by_lua_block { + local t = require("lib.test_admin").test + local code, body = t('/apisix/admin/consumers', + ngx.HTTP_PUT, + [[{ + "username": "jack", + "plugins": { + "key-auth": { + "key": "auth-one" + } + } + }]] + ) + + if code >= 300 then + ngx.status = code + ngx.say(body) + return + end + + local code, body = t('/apisix/admin/routes/1', + ngx.HTTP_PUT, + [[{ + "plugins": { + "key-auth": {}, + "example-plugin": {"i": 1}, + "skywalking": {} + }, + "upstream": { + "nodes": { + "127.0.0.1:1980": 1 + }, + "type": "roundrobin" + }, + "uri": "/opentracing" + }]] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- request +GET /t +--- response_body +passed +--- no_error_log +[error] + + + +=== TEST 15: hit +--- request +GET /opentracing +--- error_code: 401 +--- no_error_log +[error] +--- grep_error_log eval +qr/(skywalking run \w+|plugin body_filter phase)/ +--- grep_error_log_out +skywalking run start +plugin body_filter phase +plugin body_filter phase +skywalking run finish +skywalking run prepareForReport