Skip to content

Commit 91ff0bc

Browse files
authored
Better detection of log fields (#38)
1 parent bc70116 commit 91ff0bc

3 files changed

Lines changed: 37 additions & 31 deletions

File tree

src/preprocessors/__snapshots__/index.test.js.snap

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,41 +46,41 @@ Object {
4646
Object {
4747
"config": Object {},
4848
"labels": undefined,
49-
"name": "http.status_code",
50-
"type": "number",
49+
"name": "tags",
50+
"type": "other",
5151
"values": Array [
52-
200,
53-
undefined,
52+
"{\\"http.status_code\\":200,\\"large_batch\\":true,\\"trace_id\\":\\"d29a3fa8fb446ec65eb691a3259a541e\\"}",
53+
"{\\"customer\\":\\"hipcore\\",\\"large_batch\\":false,\\"trace_id\\":\\"d0fa420269652931236c94bc54d2233e\\"}",
5454
],
5555
},
5656
Object {
5757
"config": Object {},
5858
"labels": undefined,
59-
"name": "large_batch",
60-
"type": "boolean",
59+
"name": "k8s_environment",
60+
"type": "string",
6161
"values": Array [
62-
true,
63-
false,
62+
undefined,
63+
"production",
6464
],
6565
},
6666
Object {
6767
"config": Object {},
6868
"labels": undefined,
69-
"name": "trace_id",
69+
"name": "k8s_namespace",
7070
"type": "string",
7171
"values": Array [
72-
"d29a3fa8fb446ec65eb691a3259a541e",
73-
"d0fa420269652931236c94bc54d2233e",
72+
undefined,
73+
"default",
7474
],
7575
},
7676
Object {
7777
"config": Object {},
7878
"labels": undefined,
79-
"name": "customer",
79+
"name": "k8s_pod",
8080
"type": "string",
8181
"values": Array [
8282
undefined,
83-
"hipcore",
83+
"hipcore-pod",
8484
],
8585
},
8686
],

src/preprocessors/index.test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ test('preprocesses logs successfully', () => {
2828
large_batch: false,
2929
trace_id: 'd0fa420269652931236c94bc54d2233e',
3030
},
31+
k8s_environment: 'production',
32+
k8s_namespace: 'default',
33+
k8s_pod: 'hipcore-pod',
3134
},
3235
],
3336
],

src/preprocessors/logs.ts

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,38 @@ export function preprocessLogs(res: QueryLogsRes, query: LightstepQuery) {
4040
preferredVisualisationType: 'logs',
4141
},
4242
fields: [
43+
// time, content, and level are required by the Grafana panel, all other
44+
// fields are considered custom fields
4345
{ name: 'time', type: FieldType.time },
4446
{ name: 'content', type: FieldType.string },
4547
{ name: 'level', type: FieldType.string },
46-
{ name: 'severity', type: FieldType.string },
4748
],
4849
});
4950

5051
res.data.attributes.logs.forEach(([timestamp, log]) => {
51-
let tags = {};
52-
if ('tags' in log && log.tags !== null && typeof log.tags === 'object') {
53-
tags = log.tags;
54-
Object.entries(log.tags).forEach(([key, value]) => {
55-
// Add every log tag to the set of detected fields once
56-
if (!detectedFields.has(key)) {
57-
detectedFields.set(key, true);
58-
frame.addField({
59-
name: key,
60-
type: getFieldTypeForValue(value),
61-
});
62-
}
63-
});
64-
}
52+
const { body, Body, event, ...customFields } = log;
53+
54+
const transformedFields: Record<string, unknown> = {};
55+
Object.entries(customFields).forEach(([key, value]) => {
56+
// Add every field to the set of detected fields once
57+
if (!detectedFields.has(key)) {
58+
detectedFields.set(key, true);
59+
frame.addField({
60+
name: key,
61+
type: getFieldTypeForValue(value),
62+
});
63+
}
64+
65+
// Complex fields (objects, arrays) aren't supported by Grafana, so we
66+
// need to stringify them
67+
transformedFields[key] = typeof value === 'object' ? JSON.stringify(value) : value;
68+
});
6569

6670
frame.add({
6771
time: timestamp,
68-
content: log.event,
72+
content: body ?? Body ?? event ?? '',
6973
level: getLevel(log),
70-
severity: log.severity,
71-
...tags,
74+
...transformedFields,
7275
});
7376
});
7477

0 commit comments

Comments
 (0)