diff --git a/hooks/sentry/README.md b/hooks/sentry/README.md
index bf0e950..ba64ed4 100644
--- a/hooks/sentry/README.md
+++ b/hooks/sentry/README.md
@@ -1,12 +1,15 @@
 # Sentry Hook for Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:" />
 
-[Sentry](https://getsentry.com) provides both self-hosted and hostes solutions for exception tracking.
-Both client and server are [open source](https://github.com/getsentry/sentry).
+[Sentry](https://getsentry.com) provides both self-hosted and hosted
+solutions for exception tracking.
+Both client and server are
+[open source](https://github.com/getsentry/sentry).
 
 ## Usage
 
-Every sentry application defined on the server gets a different [DNS](https://www.getsentry.com/docs/). In the example below replace `YOUR_DSN` with the one created for your application.
-
+Every sentry application defined on the server gets a different
+[DSN](https://www.getsentry.com/docs/). In the example below replace
+`YOUR_DSN` with the one created for your application.
 
 ```go
 import (
@@ -27,3 +30,13 @@
   }
 }
 ```
+
+## Special fields
+
+Some logrus fields have a special meaning in this hook,
+these are server_name and logger.
+When logs are sent to sentry these fields are treated differently.
+- server_name (also known as hostname) is the name of the server which
+is logging the event (hostname.example.com)
+- logger is the part of the application which is logging the event.
+In go this usually means setting it to the name of the package.
diff --git a/hooks/sentry/sentry.go b/hooks/sentry/sentry.go
index 74e8bbe..392601e 100644
--- a/hooks/sentry/sentry.go
+++ b/hooks/sentry/sentry.go
@@ -35,21 +35,18 @@
 
 // SentryHook delivers logs to a sentry server.
 type SentryHook struct {
-	// DSN for this application
-	// Modifications to this field after the call to NewSentryHook have no effect
-	DSN string
-
 	client *raven.Client
 	levels []logrus.Level
 }
 
-// NewSentryHook creates a hook to be added to an instance of logger and initializes the raven client.
+// NewSentryHook creates a hook to be added to an instance of logger
+// and initializes the raven client.
 func NewSentryHook(DSN string, levels []logrus.Level) (*SentryHook, error) {
 	client, err := raven.NewClient(DSN, nil)
 	if err != nil {
 		return nil, err
 	}
-	return &SentryHook{DSN, client, levels}, nil
+	return &SentryHook{client, levels}, nil
 }
 
 // Called when an event should be sent to sentry
@@ -74,8 +71,8 @@
 	}
 	packet.Extra = map[string]interface{}(d)
 
-	_, errCh := hook.client.Capture(packet, nil)
-	return <-errCh
+	hook.client.Capture(packet, nil)
+	return nil
 }
 
 // Levels returns the available logging levels.
diff --git a/hooks/sentry/sentry_test.go b/hooks/sentry/sentry_test.go
index 747d75f..45f18d1 100644
--- a/hooks/sentry/sentry_test.go
+++ b/hooks/sentry/sentry_test.go
@@ -25,7 +25,7 @@
 	return l
 }
 
-func getTestDSN(t *testing.T) (string, <-chan *raven.Packet, func()) {
+func WithTestDSN(t *testing.T, tf func(string, <-chan *raven.Packet)) {
 	pch := make(chan *raven.Packet, 1)
 	s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
 		defer req.Body.Close()
@@ -38,56 +38,60 @@
 
 		pch <- p
 	}))
+	defer s.Close()
 
 	fragments := strings.SplitN(s.URL, "://", 2)
-	dsn := "%s://public:secret@%s/sentry/project-id"
-
-	return fmt.Sprintf(dsn, fragments[0], fragments[1]), pch, s.Close
+	dsn := fmt.Sprintf(
+		"%s://public:secret@%s/sentry/project-id",
+		fragments[0],
+		fragments[1],
+	)
+	tf(dsn, pch)
 }
 
 func TestSpecialFields(t *testing.T) {
-	logger := getTestLogger()
-	dsn, pch, closeFn := getTestDSN(t)
-	defer closeFn()
+	WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) {
+		logger := getTestLogger()
 
-	hook, err := NewSentryHook(dsn, []logrus.Level{
-		logrus.ErrorLevel,
+		hook, err := NewSentryHook(dsn, []logrus.Level{
+			logrus.ErrorLevel,
+		})
+
+		if err != nil {
+			t.Fatal(err.Error())
+		}
+		logger.Hooks.Add(hook)
+		logger.WithFields(logrus.Fields{
+			"server_name": server_name,
+			"logger":      logger_name,
+		}).Error(message)
+
+		packet := <-pch
+		if packet.Logger != logger_name {
+			t.Errorf("logger should have been %s, was %s", logger_name, packet.Logger)
+		}
+
+		if packet.ServerName != server_name {
+			t.Errorf("server_name should have been %s, was %s", server_name, packet.ServerName)
+		}
 	})
-
-	if err != nil {
-		t.Fatal(err.Error())
-	}
-	logger.Hooks.Add(hook)
-	logger.WithFields(logrus.Fields{
-		"server_name": server_name,
-		"logger":      logger_name,
-	}).Error(message)
-
-	packet := <-pch
-	if packet.Logger != logger_name {
-		t.Errorf("logger should have been %s, was %s", logger_name, packet.Logger)
-	}
-
-	if packet.ServerName != server_name {
-		t.Errorf("server_name should have been %s, was %s", server_name, packet.ServerName)
-	}
 }
 
 func TestSentryHandler(t *testing.T) {
-	logger := getTestLogger()
-	dsn, pch, closeFn := getTestDSN(t)
-	defer closeFn()
-	hook, err := NewSentryHook(dsn, []logrus.Level{
-		logrus.ErrorLevel,
-	})
-	if err != nil {
-		t.Fatal(err.Error())
-	}
-	logger.Hooks.Add(hook)
+	WithTestDSN(t, func(dsn string, pch <-chan *raven.Packet) {
+		logger := getTestLogger()
+		hook, err := NewSentryHook(dsn, []logrus.Level{
+			logrus.ErrorLevel,
+		})
+		if err != nil {
+			t.Fatal(err.Error())
+		}
+		logger.Hooks.Add(hook)
 
-	logger.Error(message)
-	packet := <-pch
-	if packet.Message != message {
-		t.Errorf("message should have been %s, was %s", message, packet.Message)
-	}
+		logger.Error(message)
+		packet := <-pch
+		if packet.Message != message {
+			t.Errorf("message should have been %s, was %s", message, packet.Message)
+		}
+	})
 }
