gcp-ingestion icon indicating copy to clipboard operation
gcp-ingestion copied to clipboard

Unrouteable message due to normalization of keys

Open whd opened this issue 8 months ago • 5 comments

/CC @akkomar

Here's a stripped down ping demonstrating the failure. Basically, it appears that this ping passes schema validation treating wr.framebuild_time and wr_framebuild_time as both acceptable but then chokes when reconciling the two at a later step. If you remove one or the other this ping gets routed correctly.

This should probably be treated as an error since a client should not be sending one or the other of these.

{
    "ping_info": {
        "seq": 0,
        "start_time": "2024-06-20T11:50+03:00",
        "end_time": "2024-06-21T10:41+03:00",
        "reason": "overdue"
    },
    "client_info": {
        "telemetry_sdk_build": "52.7.0",
        "app_display_version": "115.12.0",
        "app_channel": "esr",
        "app_build": "20240603145132",
        "architecture": "x86",
        "os": "Windows",
        "os_version": "6.1",
        "first_run_date": "2024-06-18+03:00",
        "build_date": "1970-01-01T00:00:00+00:00",
        "client_id": "e7ee6fd7-ec98-451e-b75e-f8443b46297a",
        "windows_build_number": 7600
    },
    "metrics": {
        "timing_distribution": {
            "wr.framebuild_time": {
                "values": {
                    "0": 0
                },
                "sum": 0
            },
            "wr_framebuild_time": {
                "values": {
                    "0": 0
                },
                "sum": 0
            }
        }
    }
}
extendedStackTrace: "java.lang.ClassCastException: class com.fasterxml.jackson.databind.node.ArrayNode cannot be cast to class com.fasterxml.jackson.databind.node.ObjectNode (com.fasterxml.jackson.databind.node.ArrayNode and com.fasterxml.jackson.databind.node.ObjectNode are in unnamed module of loader 'app')
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.processField(PubsubMessageToObjectNode.java:439) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.transformForBqSchema(PubsubMessageToObjectNode.java:398) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.processField(PubsubMessageToObjectNode.java:458) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.transformForBqSchema(PubsubMessageToObjectNode.java:398) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.processField(PubsubMessageToObjectNode.java:458) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.transformForBqSchema(PubsubMessageToObjectNode.java:398) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.processField(PubsubMessageToObjectNode.java:458) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.transformForBqSchema(PubsubMessageToObjectNode.java:398) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.core.transform.PubsubMessageToObjectNode$Payload.apply(PubsubMessageToObjectNode.java:344) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.io.Gcs$Write$Ndjson$LazyEncodedInput.encode(Gcs.java:67) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.io.Gcs$Write$LazyEncodedInput.get(Gcs.java:116) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.io.Gcs$Write$Batch.getByteSize(Gcs.java:158) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.io.Gcs$Write$Batch.getByteSize(Gcs.java:122) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.util.BatchWrite$Batch.add(BatchWrite.java:210) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.util.BatchWrite.lambda$apply$3(BatchWrite.java:157) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1932) ~[?:?]
	at com.mozilla.telemetry.ingestion.sink.util.BatchWrite.apply(BatchWrite.java:155) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.util.BatchWrite.apply(BatchWrite.java:26) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.config.SinkConfig$Output.apply(SinkConfig.java:162) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.mozilla.telemetry.ingestion.sink.config.SinkConfig$Output.apply(SinkConfig.java:136) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106) ~[?:?]
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235) ~[?:?]
	at com.mozilla.telemetry.ingestion.sink.io.Pubsub.lambda$getConsumer$2(Pubsub.java:37) ~[ingestion-sink-0.1-SNAPSHOT.jar:?]
	at com.google.cloud.pubsub.v1.MessageDispatcher$3.run(MessageDispatcher.java:441) ~[google-cloud-pubsub-1.124.1.jar:1.124.1]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
	at java.lang.Thread.run(Thread.java:829) ~[?:?]
"
localizedMessage: "class com.fasterxml.jackson.databind.node.ArrayNode cannot be cast to class com.fasterxml.jackson.databind.node.ObjectNode (com.fasterxml.jackson.databind.node.ArrayNode and com.fasterxml.jackson.databind.node.ObjectNode are in unnamed module of loader 'app')"

whd avatar Jun 21 '24 20:06 whd