bhuvan-somisetty opened a new issue, #14000:
URL: https://github.com/apache/apisix/issues/14000
### Current Behavior
In `apisix/plugins/datadog.lua`, when `prefer_name` is enabled (default is
`true`), the plugin attempts to resolve the service name:
```lua
-- if prefer_name is set, fetch the service/route name. If the name is nil,
fall back to id.
if conf.prefer_name then
if entry.service_id and entry.service_id ~= "" then
local svc = service_fetch(entry.service_id)
if svc and svc.value.name ~= "" then
entry.service_id = svc.value.name
end
end
...
```
In Lua, `nil ~= ""` evaluates to `true`. When a service exists in APISIX but
has no `name` property set (the `name` field in Service schema is optional),
`svc.value.name` is `nil`.
Because `nil ~= ""` is `true`, the condition `if svc and svc.value.name ~=
""` evaluates to `true`, and `entry.service_id` is assigned `svc.value.name`
(`nil`), overwriting the valid service ID.
Consequently, when `generate_tag()` builds the metric tags:
```lua
local variable_tags = {
...
{"service_name", entry.service_id},
...
}
```
`entry.service_id` is `nil`, so the `service_name` tag is completely omitted
from the emitted DogStatsD metric datagrams instead of falling back to the
service ID as intended.
### Expected Behavior
When a Service does not have a `name` configured (`svc.value.name == nil`),
`entry.service_id` should remain set to the service's ID, and
`service_name:<id>` should be emitted in Datadog metrics tags.
### Error Logs
No error logs are printed because Lua executes the assignment silently.
However, inspecting the emitted UDP DogStatsD datagrams reveals that
`service_name` is missing from the tags list whenever the associated service
lacks an explicit `name`.
### Steps to Reproduce
1. Create an upstream and a service without specifying a `name`:
```bash
curl -i http://127.0.0.1:9180/apisix/admin/services/s1 -H 'X-API-KEY:
edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"upstream": {
"type": "roundrobin",
"nodes": {"127.0.0.1:1980": 1}
}
}'
```
2. Create a route referencing service `s1` with `datadog` plugin enabled
(`prefer_name: true` by default):
```bash
curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY:
edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/hello",
"service_id": "s1",
"plugins": {
"datadog": {}
}
}'
```
3. Send a request to `/hello`.
4. Observe the DogStatsD UDP packets received at port 8125: the tags contain
`route_name:1`, `path:...`, but `service_name:s1` is completely absent because
`entry.service_id` was overwritten with `nil`.
### Environment
- APISIX version (run `apisix version`): 3.19.0 (master @ c6b2adc3)
- Operating system (run `uname -a`): Linux / POSIX
- OpenResty / Nginx version (run `openresty -V` or `nginx -V`): OpenResty
1.25+
- etcd version, if relevant: N/A
- APISIX Dashboard version, if relevant: N/A
- Plugin runner version, for issues related to plugin runners: N/A
- LuaRocks version, for installation issues: N/A
--
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]