circleci / rollcage

A Clojure client for Rollbar
Eclipse Public License 1.0
50 stars 28 forks source link

How to log arbitrary messages? #43

Open acobster opened 5 years ago

acobster commented 5 years ago

The Rollbar PHP SDK (just as an example) allows for logging arbitrary messages to Rollbar:

You can also send Rollbar log-like messages:

<?php
use Rollbar\Rollbar;
use Rollbar\Payload\Level;

Rollbar::log(Level::WARNING, 'could not connect to mysql server');
Rollbar::log(
    Level::INFO, 
    'Here is a message with some additional data',
    array('x' => 10, 'code' => 'blue')
);

This is really useful for certain kinds of remote debugging situations, e.g. when you haven't been able to reproduce a production error yet and need more contextual information.

What I'd like to be able to do in Clojure is something like:

(rollcage/info "some message")
,,,
(rollcage/debug "another message with some context" {:more "context"})

As far as I can tell, though, this would require a change to the API of the core/notify fn, which always expects a Throwable. I think it makes sense to have the Rollcage internals know what to do with Throwable instances when it sees them, but the current API seems to preclude certain valid use-cases of the wider Rollbar API. Or maybe I'm missing something?

Edit: to be clear, I'm happy to submit a PR for widening the API, but I thought it would be best to discuss what that wider API would look first. Thoughts?

Thanks!

ash14 commented 4 years ago

+1, I'd be happy to get the ball rolling with this as well.

More specific implementation details: https://docs.rollbar.com/reference

Required: "trace", "trace_chain", "message", or "crash_report" (exactly one) [...] If a message with no stack trace, use "message"

acobster commented 4 years ago

@ash14 thanks for the +1. I'm thinking maybe we expand core/notify to accept a custom protocol, say, Loggable, which we then extend to Throwable and String. Does that sound like the right approach to you?

Would love to hear from someone at CircleCI about this as well.

ash14 commented 4 years ago

After looking at the docs a bit closer, these arbritrary messages can have arbritrary data as well.

So it looks like the user-facing API should support either of these forms:

(rollcage/error r err) 
; "trace_chain": [{...}]
(rollcage/warn r "Request over threshold of 10 seconds")
; "message": {
;   "body": "Request over threshold of 10 seconds"
; }
(rollcage/warn r "Request over threshold of 10 seconds" {:route "home#index"
                                                         :time_elapsed 15.23})
; "message": {
;   "body": "Request over threshold of 10 seconds",
;   "route": "home#index",
;   "time_elapsed": 15.23
; }

This adds some complication though... I'd start with getting a core/build-trace alternative to play nicely with those 3 forms and return the respective JSON key/value pair.

Protocols sound like a suitable implementation, yeah.

nfedyashev commented 4 years ago

+1 context params are extremely important and useful not just for "arbitrary messages" but for regular exceptions as well.