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

   ### Description
   
   Hi guys, when I'm trying to integrate apisix opentelemetry plugin with 
`trace_id_source  =  x-request-id` , I got following error in apisix log
   ```
   2023/01/23 11:36:36 [error] 49#49: *5867 lua entry thread aborted: runtime 
error: bad argument #1 to '?' (invalid value)
   stack traceback:
   coroutine 0:
           [C]: in function 'gsub'
           ...deps/share/lua/5.1/opentelemetry/trace/exporter/otlp.lua:18: in 
function 'hex2bytes'
           ...deps/share/lua/5.1/opentelemetry/trace/exporter/otlp.lua:50: in 
function 'export_spans'
           ...are/lua/5.1/opentelemetry/trace/batch_span_processor.lua:18: in 
function 'process_batches'
           ...are/lua/5.1/opentelemetry/trace/batch_span_processor.lua:46: in 
function <...are/lua/5.1/opentelemetry/trace/batch_span_processor.lua:29>, 
context: ngx.timer, client: 10.224.104.5, server: 0.0.0.0:9080
   ```
   After a little dive into it, turns out the value of `x-request-id` header 
must be match with regex `[0-9a-f]{32}` since traceId only support that 
pattern. and currently request-id plugin doesn't support that regex patterns.
   
   My configurations looks like this.
   ```
   # conf/config.yaml
   plugins:
   - request-id
   - opentelemetry
   plugin_attr:
     opentelemetry:
       trace_id_source: x-request-id
       resource:
         service.name: APISIX
       collector:
         address: http://jaeger.jaeger.svc.cluster.local:4318/  # OTLP receiver
   ```
   ```
   # global rules to enable the plugin globally
   {
     "value": {
       "plugins": {
         "request-id": {
           "header_name": "X-Request-Id",
           "algorithm": "uuid",
           "include_in_response": true
         },
         "opentelemetry": {
           "additional_attributes": [
             "route_id",
             "request_method"
           ],
           "sampler": {
             "options": {
               "root": {
                 "name": "always_off"
               },
               "fraction": 0
             },
             "name": "always_on"
           }
         }
       },
       "id": "1"
     },
     "createdIndex": 15,
     "modifiedIndex": 14622,
     "key": "/apisix/global_rules/1"
   }
   ```
   
   I thought it would be nice if traceID could use the request id generated by 
the request-id plugin. by default the request-id plugin uses a uuid that 
doesn't match trace_id_source with regex `[0-9a-f]{32}`
   
   As a workaround, I create the logic with `serverless-pre-function` plugin as 
`request-id` plugin replacement.
   ```
   curl -X PUT http://127.0.0.1:9180/apisix/admin/global_rules/1 -H 'X-API-Key: 
edd1c9f034335f136f87ad84b625c8f1' -H 'Content-Type: application/json' \
   -d '{
          "plugins": {
             "serverless-pre-function": {
               "phase": "rewrite",
               "functions" : ["return function() local headers = 
ngx.req.get_headers() if not headers[\"X-Request-Id\"] then local characters = 
{\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", 
\"b\", \"c\", \"d\", \"e\", \"f\"} local id = \"\" for i = 1, 32 do local index 
= math.random(1, #characters) id = id .. characters[index] end 
ngx.req.set_header(\"X-Request-Id\", id) ngx.header[\"X-Request-Id\"] = id else 
ngx.header[\"X-Request-Id\"] = headers[\"X-Request-Id\"] end end"]
             }
          }
   ```
   Test result:
   ```
   $ curl http://httpbin.kubernetestest.com/ip -sI                       
   
   HTTP/1.1 200 OK
   Content-Type: application/json
   Content-Length: 32
   Connection: keep-alive
   X-Request-Id: 943ee4e49cdcfa9a69521123978d0f3e
   Date: Mon, 23 Jan 2023 14:47:20 GMT
   Access-Control-Allow-Origin: *
   Access-Control-Allow-Credentials: true
   Server: APISIX/3.1.0
   ```
   
   With this, I propose to add above lua code in the `request-id` plugin as a 
new algorithm.


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