stackbuilders / rollbar-haskell

A group of libraries written in Haskell to communicate with Rollbar API.
MIT License
7 stars 4 forks source link

createItem not serializing `Nothing`s correctly #23

Open tillydray opened 3 years ago

tillydray commented 3 years ago

We are using katip for logging. So we want to create a Rollbar.Item from a Katip.Item and we have this function

mkRollbarItem :: Katip.LogItem a => Katip.Item a -> Rollbar.Item
mkRollbarItem katipItem =
  let payload =
        Rollbar.PayloadMessage $
          Rollbar.Message
            { Rollbar.messageBody =
                LT.toStrict . TB.toLazyText . coerce $
                  Katip._itemMessage katipItem
            , Rollbar.messageMetadata = katipItemToObject katipItem
            }
   in
      Rollbar.Item
        { Rollbar.itemEnvironment = Rollbar.Environment "production"
        , Rollbar.itemBody = Rollbar.Body payload
        , Rollbar.itemLevel =
            katipSeverityToRollbarLevel $
              Katip._itemSeverity katipItem
        , Rollbar.itemPlatform = Nothing
        , Rollbar.itemLanguage = Just "Haskell"
        , Rollbar.itemFramework = Nothing
        , Rollbar.itemRequest = Nothing
        , Rollbar.itemServer = Nothing
        , Rollbar.itemNotifier = Rollbar.Notifier "" ""
        }

Note that both Rollbar.itemServer and Rollbar.itemPlatform are listed as Maybes in the Rollbar.Client docs. And yet, we get this error. The ellipsis is irrelevant stuff

(StatusCodeException (Response {responseStatus = Status {statusCode = 422, statusMessage = "Unprocessable Entity"}, ... "{\n \"err\": 1,\n \"message\": \"Invalid format. data.platform should be string. data.server should be object.\"\n}")))

So we did

let rollbarItem = mkRollbarItem katipItem
_ <- Debug.trace (LBS.unpack $ Aeson.encode rollbarItem) (Rollbar.createItem rollbarItem)

and noticed that platform, server, and other Nothings were serialized as {"server":null, "platform":null, ...}, which seems to make rollbar api unhappy.

DavidMazarro commented 1 year ago

A starting point for anyone that wants to tackle this issue: the create item docs of the Rollbar API states that some of the fields are optional, so instead of being serialized as "server": null or "platform": null like what's currently happening, they should be left out of the request when set to Nothing. This should be reflected in the ToJSON Item instance.