tokio-rs / tracing

Application level tracing for Rust.
https://tracing.rs
MIT License
5.53k stars 726 forks source link

span record method does not record attribute as u16 #3104

Open pitoniak32 opened 1 month ago

pitoniak32 commented 1 month ago

Bug Report

Version

❯ cargo tree | rg tracing
│   │   └── tracing v0.1.40
│   │       ├── tracing-attributes v0.1.27 (proc-macro)
│   │       └── tracing-core v0.1.32
│   │   │   └── tracing v0.1.40 (*)
│   │   └── tracing v0.1.40 (*)
│   │   └── tracing v0.1.40 (*)
│   └── tracing v0.1.40 (*)
│   │       │   └── tracing v0.1.40 (*)
│   │       └── tracing v0.1.40 (*)
│   └── tracing v0.1.40 (*)
├── tracing v0.1.40 (*)
├── tracing-log v0.2.0
│   └── tracing-core v0.1.32 (*)
├── tracing-opentelemetry v0.27.0
│   ├── tracing v0.1.40 (*)
│   ├── tracing-core v0.1.32 (*)
│   ├── tracing-log v0.2.0 (*)
│   └── tracing-subscriber v0.3.18
│       ├── tracing v0.1.40 (*)
│       ├── tracing-core v0.1.32 (*)
│       └── tracing-log v0.2.0 (*)
└── tracing-subscriber v0.3.18 (*)

Platform

Linux d 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Description

I am seeing the incorrect type for an integer attribute / tag values that are exported to an external tracing backend (Jaeger).

I tried this code:

tracing::info_span!("request",
    { HTTP_RESPONSE_STATUS_CODE } = None::<u16>,
)

span.record(
    HTTP_RESPONSE_STATUS_CODE,
    response.status().as_u16(), // this returns a u16 `pub fn as_u16(&self) -> u16`
);

I expected to see the type of the http.response.status_code field to be an integer.

Screenshot 2024-10-12 124601

Instead, it was a string.

Screenshot 2024-10-12 124417

if I use an integer directly it will be the correct type:

tracing::info_span!("request",
    { HTTP_RESPONSE_STATUS_CODE } = None::<u16>,
)

span.record(
    HTTP_RESPONSE_STATUS_CODE,
    400,
);
pitoniak32 commented 1 month ago

(facepalm 😅) I found a work around for the issue. If you as i64 the value, it shows as an integer in the trace backends.

where I stumbled on the fix

I am still wondering if this is expected behavior?

tracing::info_span!("request",
    { HTTP_RESPONSE_STATUS_CODE } = None::<u16>,
)

span.record(
    HTTP_RESPONSE_STATUS_CODE,
    response.status().as_u16() as i64,
);
pitoniak32 commented 1 month ago

I am still wondering if this is expected behavior?

If it is, I would like to open a PR adding a little documentation to the span.record method to give an example of how to record integer types.

Thank you all again for the amazing work that you do!