buz icon indicating copy to clipboard operation
buz copied to clipboard

Increase resilience in eventBuilders

Open johncassil opened this issue 2 years ago • 0 comments

Right now, sometimes sending unexpected payloads can cause 500 responses with panics:

import requests
payload = {
  "schema": "iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0",
  "data": {
    "schema": "iglu:com.my_company/viewed_product/jsonschema/1-0-0",
    "data": {
      "product_id": "ASO01043",
      "price": 49.95
    }
  }
}
requests.post('http://localhost:8080/com.snowplowanalytics.snowplow/tp2', json=payload)
2022/09/06 23:08:07 [Recovery] 2022/09/06 - 23:08:07 panic recovered:
POST /com.snowplowanalytics.snowplow/tp2 HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 208
Content-Type: application/json
User-Agent: python-requests/2.27.1


runtime error: invalid memory address or nil pointer dereference
/usr/local/Cellar/go/1.19/libexec/src/runtime/panic.go:260 (0x103b9e4)
        panicmem: panic(memoryError)
/usr/local/Cellar/go/1.19/libexec/src/runtime/signal_unix.go:835 (0x1053a1c)
        sigpanic: panicmem()
/Users/jpcassil/buz/pkg/snowplow/eventBuilder.go:169 (0x1bf16f9)
        setTstamps: e.DvceCreatedTstamp = *getTimeParam(params, "dtm")
/Users/jpcassil/buz/pkg/snowplow/eventBuilder.go:355 (0x1bf3ee7)
        BuildEventFromMappedParams: setTstamps(&event, params)
/Users/jpcassil/buz/pkg/envelope/builderSnowplow.go:106 (0x1bf70fe)
        BuildSnowplowEnvelopesFromRequest: spEvent := snowplow.BuildEventFromMappedParams(c, event.Value().(map[string]interface{}), *conf)
/Users/jpcassil/buz/pkg/handler/snowplow.go:21 (0x2d9da2e)
        SnowplowHandler.func1: envelopes := envelope.BuildSnowplowEnvelopesFromRequest(c, h.Config, h.CollectorMeta)
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:168 (0x181145c)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpcassil/buz/pkg/middleware/identity.go:50 (0x2da8e5c)
        Identity.func1: c.Next()
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:168 (0x181145c)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpcassil/buz/pkg/middleware/cors.go:28 (0x2da899a)
        CORS.func1: c.Next()
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:168 (0x181145c)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/recovery.go:99 (0x18220d7)
        CustomRecoveryWithWriter.func1: c.Next()
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:168 (0x181145c)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:555 (0x181fe93)
        (*Engine).handleHTTPRequest: c.Next()
/Users/jpcassil/go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:511 (0x181f964)
        (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
/usr/local/Cellar/go/1.19/libexec/src/net/http/server.go:2947 (0x14ad873)
        serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
/usr/local/Cellar/go/1.19/libexec/src/net/http/server.go:1991 (0x14a73db)
        (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
/usr/local/Cellar/go/1.19/libexec/src/runtime/asm_amd64.s:1594 (0x10705a0)
        goexit: BYTE    $0x90   // NOP

We should consider building in some nice mechanisms for graceful failures and helpful responses, where applicable.

I'm not sure what about this payload in particular caused a panic.

johncassil avatar Sep 07 '22 03:09 johncassil