code: public static void send(Throwable throwable, List tags, Map userCustomData) {
      RaygunMessage msg = buildMessage(throwable);
  
      if (msg == null) {
        RaygunLogger.e("Failed to send RaygunMessage - due to invalid message being built");
        return;
      }
  
      msg.getDetails().setTags(RaygunUtils.mergeLists(RaygunClient.tags, tags));
      msg.getDetails().setUserCustomData(RaygunUtils.mergeMaps(RaygunClient.userCustomData, userCustomData));
  
      if (RaygunClient.onBeforeSend != null) {
        msg = RaygunClient.onBeforeSend.onBeforeSend(msg);
        if (msg == null) {
          return;
        }
      }
  
      enqueueWorkForCrashReportingService(RaygunClient.apiKey, new Gson().toJson(msg));
      postCachedMessages();
    }
docs: Sends an exception-type object to Raygun with a list of tags you specify, and a set of
  custom data.
  @param throwable The Throwable object that occurred in your application that will be sent to Raygun.
  @param tags A list of data that will be attached to the Raygun message and visible on the error in the dashboard.
  This could be a build tag, lifecycle state, debug/production version etc.
  @param userCustomData A set of custom key-value pairs relating to your application and its current state. This is a bucket
  where you can attach any related data you want to see to the error.