Skip to content

Commit 26b4495

Browse files
authored
Added some cleanup for IPs and memory addresses in telemetry errors (#251)
* Added some cleanup for IPs and memory addresses in telemetry errors * Locking version of ubuntu so java update doesn't fail tests
1 parent 03ef036 commit 26b4495

File tree

6 files changed

+91
-9
lines changed

6 files changed

+91
-9
lines changed

.github/workflows/build.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ on:
1010
jobs:
1111
cancel_previous:
1212

13-
runs-on: ubuntu-latest
13+
runs-on: ubuntu-22.04
1414
steps:
1515
- uses: styfle/cancel-workflow-action@0.9.1
1616
with:
1717
workflow_id: ${{ github.event.workflow.id }}
1818

1919
core-test:
2020
needs: cancel_previous
21-
runs-on: ubuntu-latest
21+
runs-on: ubuntu-22.04
2222

2323
steps:
2424
- uses: actions/checkout@v2
@@ -42,7 +42,7 @@ jobs:
4242

4343
android-test:
4444
needs: cancel_previous
45-
runs-on: ubuntu-latest
45+
runs-on: ubuntu-22.04
4646

4747
steps:
4848
- uses: actions/checkout@v2
@@ -66,7 +66,7 @@ jobs:
6666

6767
destination-test:
6868
needs: cancel_previous
69-
runs-on: ubuntu-latest
69+
runs-on: ubuntu-22.04
7070

7171
steps:
7272
- uses: actions/checkout@v2
@@ -90,7 +90,7 @@ jobs:
9090

9191
security:
9292
needs: cancel_previous
93-
runs-on: ubuntu-latest
93+
runs-on: ubuntu-22.04
9494

9595
steps:
9696
- uses: actions/checkout@v2

.github/workflows/create_jira.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88
jobs:
99
create_jira:
1010
name: Create Jira Ticket
11-
runs-on: ubuntu-latest
11+
runs-on: ubuntu-22.04
1212
environment: IssueTracker
1313
steps:
1414
- name: Checkout

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77

88
jobs:
99
release:
10-
runs-on: ubuntu-latest
10+
runs-on: ubuntu-22.04
1111
environment: deployment
1212
steps:
1313
- uses: actions/checkout@v2

.github/workflows/snapshot.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66

77
jobs:
88
snapshot:
9-
runs-on: ubuntu-latest
9+
runs-on: ubuntu-22.04
1010
environment: deployment
1111
steps:
1212
- uses: actions/checkout@v2

core/src/main/java/com/segment/analytics/kotlin/core/Telemetry.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@ object Telemetry: Subscriber {
170170
addRemoteMetric(metric, tags)
171171
}
172172

173+
fun cleanErrorValue(value: String): String {
174+
var cleanedValue = value
175+
// Remove IPs
176+
cleanedValue = cleanedValue.replace(Regex("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}[\\d._:port]*"), "_IP")
177+
// Remove IPv6
178+
cleanedValue = cleanedValue.replace(Regex("[0-9a-fA-F]{2,4}(:[0-9a-fA-F]{0,4}){2,8}[\\d._:port]*"), "_IP")
179+
// Remove hex values
180+
cleanedValue = cleanedValue.replace(Regex("0x[0-9a-fA-F]+"), "0x00")
181+
// Remove hex values that don't have 0x of at least 6 characters
182+
cleanedValue = cleanedValue.replace(Regex("[0-9a-fA-F]{6,}"), "0x00")
183+
// What even? Mangled library names probably, e.g. a5.b:_some_error_etc
184+
cleanedValue = cleanedValue.replace(Regex("^[a-z][a-z0-9]\\.[a-z]:"), "")
185+
186+
return cleanedValue
187+
}
188+
173189
/**
174190
* Logs an error metric with the specified tags and log data.
175191
*
@@ -186,6 +202,10 @@ object Telemetry: Subscriber {
186202
if (tags.isEmpty()) return
187203
if (Math.random() > sampleRate) return
188204

205+
if (tags.containsKey("error")) {
206+
tags["error"] = cleanErrorValue(tags["error"]!!)
207+
}
208+
189209
var filteredTags = if(sendWriteKeyOnError) {
190210
tags.toMap()
191211
} else {

core/src/test/kotlin/com/segment/analytics/kotlin/core/TelemetryTest.kt

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ class TelemetryTest {
2929
queueBytesField.isAccessible = true
3030
return queueBytesField.get(Telemetry) as Int
3131
}
32+
fun TelemetryQueuePeek(): RemoteMetric {
33+
val queueField: Field = Telemetry::class.java.getDeclaredField("queue")
34+
queueField.isAccessible = true
35+
val queueValue: ConcurrentLinkedQueue<*> = queueField.get(Telemetry) as ConcurrentLinkedQueue<*>
36+
return queueValue.peek() as RemoteMetric
37+
}
38+
3239
var TelemetryStarted: Boolean
3340
get() {
3441
val startedField: Field = Telemetry::class.java.getDeclaredField("started")
@@ -239,4 +246,59 @@ class TelemetryTest {
239246
}
240247
assertTrue(TelemetryQueueSize() == Telemetry.maxQueueSize)
241248
}
242-
}
249+
250+
@Test
251+
fun `Test error tags are cleaned`() {
252+
Telemetry.enable = true
253+
Telemetry.start()
254+
Telemetry.error(Telemetry.INVOKE_ERROR_METRIC, "error log") {
255+
it["error"] = "foo_192.168.0.1:8080"
256+
}
257+
assertEquals(1, TelemetryQueueSize())
258+
assertEquals("foo__IP", TelemetryQueuePeek().tags["error"])
259+
}
260+
261+
@Test
262+
fun `Test error tags are cleaned for IPv6`() {
263+
Telemetry.enable = true
264+
Telemetry.start()
265+
Telemetry.error(Telemetry.INVOKE_ERROR_METRIC, "error log") {
266+
it["error"] = "foo_2001:0db8:85a3:0000:0000:8a2e:0370:7334"
267+
}
268+
assertEquals(1, TelemetryQueueSize())
269+
assertEquals("foo__IP", TelemetryQueuePeek().tags["error"])
270+
}
271+
272+
@Test
273+
fun `Test error tags are cleaned for hex values`() {
274+
Telemetry.enable = true
275+
Telemetry.start()
276+
Telemetry.error(Telemetry.INVOKE_ERROR_METRIC, "error log") {
277+
it["error"] = "foo_0x1234567890abcdef_bar"
278+
}
279+
assertEquals(1, TelemetryQueueSize())
280+
assertEquals("foo_0x00_bar", TelemetryQueuePeek().tags["error"])
281+
}
282+
283+
@Test
284+
fun `Test error tags are cleaned for sneaky hex values`() {
285+
Telemetry.enable = true
286+
Telemetry.start()
287+
Telemetry.error(Telemetry.INVOKE_ERROR_METRIC, "error log") {
288+
it["error"] = "address_deadbeef_face"
289+
}
290+
assertEquals(1, TelemetryQueueSize())
291+
assertEquals("address_0x00_face", TelemetryQueuePeek().tags["error"])
292+
}
293+
294+
@Test
295+
fun `Test error tags are cleaned for mangled library names`() {
296+
Telemetry.enable = true
297+
Telemetry.start()
298+
Telemetry.error(Telemetry.INVOKE_ERROR_METRIC, "error log") {
299+
it["error"] = "a5.b:_some_error_etc"
300+
}
301+
assertEquals(1, TelemetryQueueSize())
302+
assertEquals("_some_error_etc", TelemetryQueuePeek().tags["error"])
303+
}
304+
}

0 commit comments

Comments
 (0)