Skip to content

Commit 833a92b

Browse files
lalitbcijothomas
andauthored
feat: [Logs user_events exporter] default event_name to log, and flatten ext_dt, ext_cloud (#253)
Co-authored-by: Cijo Thomas <[email protected]>
1 parent f81a47b commit 833a92b

File tree

3 files changed

+32
-33
lines changed

3 files changed

+32
-33
lines changed

opentelemetry-user-events-logs/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
- Enhanced validation for the provider name in `with_user_event_exporter(provider_name)`:
66
- Empty provider names are now disallowed.
77

8+
- Event header name is changed to use "Log" instead of "LogRecord.EventName".
9+
- `ext_dt` and `ext_cloud` structs are flattened.
10+
are flattened.
11+
812
## v0.12.0
913

1014
- Added support for Populating Cloud RoleName, RoleInstance from Resource's

opentelemetry-user-events-logs/src/lib.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ mod tests {
164164
// Sample output from perf-decode
165165
{
166166
"./perf.data": [
167-
{ "n": "myprovider:my-event-name", "__csver__": 1024, "PartA": { "time": "2025-03-07T16:31:28.279214367+00:00" }, "PartC": { "user_name": "otel user", "user_email": "[email protected]" }, "PartB": { "_typeName": "Log", "severityNumber": 2, "severityText": "ERROR", "eventId": 20, "name": "my-event-name" }, "meta": { "time": 81252.403220286, "cpu": 4, "pid": 21084, "tid": 21085, "level": 2, "keyword": "0x1" } } ]
167+
{ "n": "myprovider:Log", "__csver__": 1024, "PartA": { "time": "2025-03-07T16:31:28.279214367+00:00", "ext_cloud_role": "myrolename" }, "PartC": { "user_name": "otel user", "user_email": "[email protected]" }, "PartB": { "_typeName": "Log", "severityNumber": 2, "severityText": "ERROR", "eventId": 20, "name": "my-event-name" }, "meta": { "time": 81252.403220286, "cpu": 4, "pid": 21084, "tid": 21085, "level": 2, "keyword": "0x1" } } ]
168168
}
169169
*/
170170

@@ -185,26 +185,26 @@ mod tests {
185185
.iter()
186186
.find(|e| {
187187
if let Some(name) = e.get("n") {
188-
name.as_str().unwrap_or("") == "myprovider:my-event-name"
188+
name.as_str().unwrap_or("") == "myprovider:Log"
189189
} else {
190190
false
191191
}
192192
})
193-
.expect("Event 'myprovider:my-event-name' not found");
193+
.expect("Event 'myprovider:Log' not found");
194194

195195
// Validate event structure and fields
196-
assert_eq!(event["n"].as_str().unwrap(), "myprovider:my-event-name");
196+
assert_eq!(event["n"].as_str().unwrap(), "myprovider:Log");
197197
assert_eq!(event["__csver__"].as_i64().unwrap(), 1024);
198198

199199
// Validate PartA
200200
let part_a = &event["PartA"];
201201
// Only check if the time field exists, not the actual value
202202
assert!(part_a.get("time").is_some(), "PartA.time is missing");
203203

204-
let part_a_ext_cloud = part_a.get("ext_cloud").expect("PartA.ext_cloud is missing");
205-
206-
// Validate role
207-
assert_eq!(part_a_ext_cloud["role"].as_str().unwrap(), "myrolename");
204+
let role = part_a
205+
.get("ext_cloud_role")
206+
.expect("PartA.ext_cloud_role is missing");
207+
assert_eq!(role.as_str().unwrap(), "myrolename");
208208

209209
// Validate PartB
210210
let part_b = &event["PartB"];

opentelemetry-user-events-logs/src/logs/exporter.rs

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ impl UserEventsExporter {
197197
.event_name()
198198
.filter(|s| !s.trim().is_empty())
199199
.unwrap_or("Log");
200-
eb.reset(event_name, 0);
200+
eb.reset("Log", 0);
201201

202202
eb.add_value("__csver__", 1024, FieldFormat::UnsignedInt, 0); // 0x400 in hex
203203

@@ -219,34 +219,29 @@ impl UserEventsExporter {
219219
eb.add_str("time", time, FieldFormat::Default, 0);
220220

221221
if let Some(trace_context) = log_record.trace_context() {
222-
cs_a_count += 1; // for ext_dt
223-
// TODO: Flattened structure might be faster
224-
eb.add_struct("ext_dt", 2, 0);
225-
eb.add_str("traceId", trace_context.trace_id.to_string(), FieldFormat::Default, 0);
226-
eb.add_str("spanId", trace_context.span_id.to_string(), FieldFormat::Default, 0);
222+
cs_a_count += 2; // for ext_dt_traceId and ext_dt_spanId
223+
eb.add_str(
224+
"ext_dt_traceId",
225+
trace_context.trace_id.to_string(),
226+
FieldFormat::Default,
227+
0,
228+
);
229+
eb.add_str(
230+
"ext_dt_spanId",
231+
trace_context.span_id.to_string(),
232+
FieldFormat::Default,
233+
0,
234+
);
227235
}
228236

229-
let mut cloud_ext_count = 0;
230-
if self.cloud_role.is_some()
231-
{
232-
cloud_ext_count += 1;
233-
}
234-
if self.cloud_role_instance.is_some()
235-
{
236-
cloud_ext_count += 1;
237+
if let Some(cloud_role) = &self.cloud_role {
238+
cs_a_count += 1;
239+
eb.add_str("ext_cloud_role", cloud_role, FieldFormat::Default, 0);
237240
}
238241

239-
if cloud_ext_count > 0 {
240-
cs_a_count += 1; // for ext_cloud
241-
eb.add_struct("ext_cloud", cloud_ext_count, 0);
242-
243-
if let Some(cloud_role) = &self.cloud_role {
244-
eb.add_str("role", cloud_role, FieldFormat::Default, 0);
245-
}
246-
247-
if let Some(cloud_role_instance) = &self.cloud_role_instance {
248-
eb.add_str("roleInstance", cloud_role_instance, FieldFormat::Default, 0);
249-
}
242+
if let Some(cloud_role_instance) = &self.cloud_role_instance {
243+
cs_a_count += 1;
244+
eb.add_str("ext_cloud_roleInstance", cloud_role_instance, FieldFormat::Default, 0);
250245
}
251246

252247
eb.set_struct_field_count(cs_a_bookmark, cs_a_count);

0 commit comments

Comments
 (0)