EthanSivan opened a new issue, #12890:
URL: https://github.com/apache/apisix/issues/12890

   ### Current Behavior
   
   Write a custom idempot.lua, save it and get an error: schema validate 
failed: schema not found, path:plugins.custom-idempot
   
   
   ### Expected Behavior
   
   _No response_
   
   ### Error Logs
   
   /usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua init
   /usr/local/openresty//luajit/bin/luajit ./apisix/cli/apisix.lua init_etcd
   trying to initialize the data of etcd
   2026/01/12 09:48:27 [warn] 1#1: low address bits of 127.0.0.1/24 are 
meaningless in /usr/local/apisix/conf/nginx.conf:246
   nginx: [warn] low address bits of 127.0.0.1/24 are meaningless in 
/usr/local/apisix/conf/nginx.conf:246
   2026/01/12 09:48:27 [warn[] 55#55: *7 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 52#52: *4 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 54#54: *6 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 49#49: *1 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 53#53: *5 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 51#51: *3 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 50#50: *2 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 56#56: *8 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 59#59: *9 [lua] plugin.lua:219: load(): new 
plugins: 
{"openwhisk":true,"openfunction":true,"serverless-post-function":true,"chaitin-waf":true,"multi-auth":true,"openid-connect":true,"authz-casbin":true,"authz-casdoor":true,"wolf-rbac":true,"ldap-auth":true,"hmac-auth":true,"basic-auth":true,"jwt-auth":true,"jwe-decrypt":true,"key-auth":true,"consumer-restriction":true,"attach-consumer-label":true,"forward-auth":true,"opa":true,"authz-keycloak":true,"proxy-cache":true,"body-transformer":true,"ai-prompt-template":true,"ai-prompt-decorator":true,"ai-prompt-guard":true,"ai-rag":true,"ai-rate-limiting":true,"ai-proxy-multi":true,"ai-proxy":true,"ai-aws-content-moderation":true,"ai-aliyun-content-moderation":true,"proxy-mirror":true,"proxy-rewrite":true,"workflow":true,"api-breaker":true,"limit-conn":true,"limit-count":true,"limit-req":true,"gzip":true,"traffic-split":true,"response-rewrite":true,"mcp-bridge":true,"degraphql":true,"kafka-proxy":true,"grpc-tra
 
nscode":true,"grpc-web":true,"http-dubbo":true,"cas-auth":true,"redirect":true,"datadog":true,"lago":true,"real-ip":true,"ai":true,"client-control":true,"proxy-control":true,"request-id":true,"zipkin":true,"ext-plugin-pre-req":true,"fault-injection":true,"mocking":true,"serverless-pre-function":true,"cors":true,"ip-restriction":true,"ua-restriction":true,"referer-restriction":true,"csrf":true,"uri-blocker":true,"request-validation":true,"inspect":true,"example-plugin":true,"aws-lambda":true,"azure-functions":true,"ai-request-rewrite":true,"ext-plugin-post-resp":true,"ext-plugin-post-req":true,"tencent-cloud-cls":true,"clickhouse-logger":true,"file-logger":true,"udp-logger":true,"syslog":true,"rocketmq-logger":true,"kafka-logger":true,"tcp-logger":true,"sls-logger":true,"google-cloud-logging":true,"skywalking-logger":true,"splunk-hec-logging":true,"http-logger":true,"loggly":true,"echo":true,"elasticsearch-logger":true,"loki-logger":true,"prometheus":true,"public-api":true},
 context:
  init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 52#52: *4 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 55#55: *7 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 53#53: *5 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 51#51: *3 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 56#56: *8 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 50#50: *2 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 49#49: *1 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 54#54: *6 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   2026/01/12 09:48:27 [warn[] 59#59: *9 [lua] plugin.lua:269: load_stream(): 
new plugins: 
{"syslog":true,"limit-conn":true,"traffic-split":true,"ip-restriction":true,"mqtt-proxy":true},
 context: init_worker_by_lua*
   
   
   ### Steps to Reproduce
   
   ## Title
   
   **APISIX installed via Helm cannot load custom in-tree plugins even when 
plugin files and config are present**
   
   ---
   
   ## Environment
   
   - **APISIX version**: 3.14.1-ubuntu
   - **Installation method**: Helm Chart  
   - **Kubernetes**: v1.33.3
   - **Deployment type**: traditional  
   - **Plugin type**: Custom Lua plugin (non-ext-plugin / in-tree style)
   
   ---
   
   ## What I tried (Steps)
   
   ### 1. Install APISIX via Helm
   
   ```bash
   helm install apisix apisix/apisix \
     --namespace apisix \
     --create-namespace \
     --set gateway.type=NodePort \
     --set admin.enabled=true \
     --set etcd.persistence.enabled=true
   ```
   
   APISIX starts successfully with default plugins.
   
   ---
   
   ### 2. Add a custom in-tree plugin
   
   Create a custom plugin file:
   
   ```text
   custom-context.lua
   ```
   
   The plugin has a valid structure:
   
   - `name`
   - `priority`
   - `schema`
   - `access(conf, ctx)` implemented
   
   ```
   -- custom-access-logger.lua
   local core = require("apisix.core")
   
   local schema = {
       type = "object",
       properties = {},
       additionalProperties = false,
   }
   
   local _M = {
       name = "custom-access-logger",
   
       priority = 100,
   
       version = 1.0,
       schema = schema,
   }
   
   function _M.log(conf, ctx)
       if ngx.status >= 400 then
           return
       end
   
       if not ctx.custom_ctx then
           return
       end
   
       local now = ngx.now()
   
       local latency = now - (ctx.custom_ctx.start_time or now)
   
       local access_log = {
           event_type = "apisix_access_log",
   
           request_id = ctx.custom_ctx.request_id,
           traceparent = ctx.custom_ctx.traceparent,
   
           method = ctx.custom_ctx.method,
           uri = ctx.custom_ctx.uri,
   
           status = ngx.status,
   
           latency_ms = math.floor(latency * 1000),
   
           timestamp = os.date("!%Y-%m-%dT%H:%M:%SZ")
       }
   
       core.log.info(
           "APISIX_ACCESS_LOG ",
           core.json.encode(access_log)
       )
   end
   
   return _M
   ```
   ---
   
   ### 3. Mount the plugin file into the Pod
   
   Mount the plugin without overwriting built-in plugins, for example:
   
   ```text
   /usr/local/apisix/custom_plugins/apisix/plugins/custom-context.lua
   ```
   
   And configure Lua search path:
   
   ```yaml
   apisix:
     extra_lua_path: "/usr/local/apisix/custom_plugins/?.lua;;"
   ```
   
   ---
   
   ### 4. Enable the plugin in `config.yaml`
   
   ```yaml
   apisix:
     plugins:
       - custom-context
   ```
   
   ---
   
   ### 5. Restart APISIX Pod
   
   ```bash
   kubectl rollout restart deploy apisix -n apisix
   ```
   
   ---
   
   ## Expected Behavior
   
   - APISIX should attempt to load `custom-context`
   - The plugin should appear in startup logs (e.g. `plugin.lua: load(): new 
plugins`)
   - The plugin should be available for use via Admin API / route configuration
   
   ---
   
   ## Actual Behavior
   
   - APISIX starts normally
   - No error logs
   - No warning logs
   - `custom-context` **never appears** in the loaded plugin list
   - The plugin is silently ignored
   
   Startup logs only show built-in plugins.
   
   ---
   ## Conclusion / Questions
   
   - Is it expected behavior that **APISIX installed via Helm cannot load new 
custom in-tree plugins without rebuilding the image**?
   - Is `ext-plugin` the **only supported extension mechanism** for Helm-based 
deployments?
   - If so, could this limitation be documented more explicitly in Helm / 
plugin documentation?
   
   ---
   
   ### Environment
   
   - APISIX version (run `apisix version`):
   - Operating system (run `uname -a`):Linux k8s-master 
5.10.134-19.1.al8.x86_64 #1 SMP Wed Jun 25 10:21:27 CST 2025 x86_64 x86_64 
x86_64 GNU/Linux
   - OpenResty / Nginx version (run `openresty -V` or `nginx -V`):use k8s
   - etcd version, if relevant (run `curl 
http://127.0.0.1:9090/v1/server_info`):
   - APISIX Dashboard version, if relevant:
   - Plugin runner version, for issues related to plugin runners:
   - LuaRocks version, for installation issues (run `luarocks --version`):
   


-- 
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