payload.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package bugsnag
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. )
  8. type payload struct {
  9. *Event
  10. *Configuration
  11. }
  12. type hash map[string]interface{}
  13. func (p *payload) deliver() error {
  14. if len(p.APIKey) != 32 {
  15. return fmt.Errorf("bugsnag/payload.deliver: invalid api key")
  16. }
  17. buf, err := json.Marshal(p)
  18. if err != nil {
  19. return fmt.Errorf("bugsnag/payload.deliver: %v", err)
  20. }
  21. client := http.Client{
  22. Transport: p.Transport,
  23. }
  24. resp, err := client.Post(p.Endpoint, "application/json", bytes.NewBuffer(buf))
  25. if err != nil {
  26. return fmt.Errorf("bugsnag/payload.deliver: %v", err)
  27. }
  28. defer resp.Body.Close()
  29. if resp.StatusCode != 200 {
  30. return fmt.Errorf("bugsnag/payload.deliver: Got HTTP %s\n", resp.Status)
  31. }
  32. return nil
  33. }
  34. func (p *payload) MarshalJSON() ([]byte, error) {
  35. severityReason := hash{
  36. "type": p.handledState.SeverityReason,
  37. }
  38. if p.handledState.Framework != "" {
  39. severityReason["attributes"] = hash{
  40. "framework": p.handledState.Framework,
  41. }
  42. }
  43. data := hash{
  44. "apiKey": p.APIKey,
  45. "notifier": hash{
  46. "name": "Bugsnag Go",
  47. "url": "https://github.com/bugsnag/bugsnag-go",
  48. "version": VERSION,
  49. },
  50. "events": []hash{
  51. {
  52. "payloadVersion": "2",
  53. "exceptions": []hash{
  54. {
  55. "errorClass": p.ErrorClass,
  56. "message": p.Message,
  57. "stacktrace": p.Stacktrace,
  58. },
  59. },
  60. "severity": p.Severity.String,
  61. "severityReason": severityReason,
  62. "unhandled": p.handledState.Unhandled,
  63. "app": hash{
  64. "releaseStage": p.ReleaseStage,
  65. },
  66. "user": p.User,
  67. "metaData": p.MetaData.sanitize(p.ParamsFilters),
  68. },
  69. },
  70. }
  71. event := data["events"].([]hash)[0]
  72. if p.Context != "" {
  73. event["context"] = p.Context
  74. }
  75. if p.GroupingHash != "" {
  76. event["groupingHash"] = p.GroupingHash
  77. }
  78. if p.Hostname != "" {
  79. event["device"] = hash{
  80. "hostname": p.Hostname,
  81. }
  82. }
  83. if p.AppType != "" {
  84. event["app"].(hash)["type"] = p.AppType
  85. }
  86. if p.AppVersion != "" {
  87. event["app"].(hash)["version"] = p.AppVersion
  88. }
  89. return json.Marshal(data)
  90. }