diff --git a/event/adapter/eventtest/eventtest.go b/event/adapter/eventtest/eventtest.go
index 4ed96fc..9928955 100644
--- a/event/adapter/eventtest/eventtest.go
+++ b/event/adapter/eventtest/eventtest.go
@@ -57,17 +57,13 @@
 	h.printer.Event(os.Stdout, ev)
 }
 
-// FixedNow updates the exporter in the context to use a time function returned
-// by TestNow to make tests reproducible.
-func FixedNow(ctx context.Context) {
+func ExporterOptions() event.ExporterOptions {
 	nextTime, _ := time.Parse(time.RFC3339Nano, "2020-03-05T14:27:48Z")
-	e, _ := event.FromContext(ctx)
-	if e == nil {
-		return
-	}
-	e.Now = func() time.Time {
-		thisTime := nextTime
-		nextTime = nextTime.Add(time.Second)
-		return thisTime
+	return event.ExporterOptions{
+		Now: func() time.Time {
+			thisTime := nextTime
+			nextTime = nextTime.Add(time.Second)
+			return thisTime
+		},
 	}
 }
diff --git a/event/bench/event_test.go b/event/bench/event_test.go
index 4f34b07..8056b08 100644
--- a/event/bench/event_test.go
+++ b/event/bench/event_test.go
@@ -89,15 +89,11 @@
 }
 
 func eventNoop() context.Context {
-	ctx := event.WithExporter(context.Background(), event.NewExporter(noopHandler{}))
-	eventtest.FixedNow(ctx)
-	return ctx
+	return event.WithExporter(context.Background(), eventtest.ExporterOptions().NewExporter(noopHandler{}))
 }
 
 func eventPrint(w io.Writer) context.Context {
-	ctx := event.WithExporter(context.Background(), event.NewExporter(logfmt.NewHandler(w)))
-	eventtest.FixedNow(ctx)
-	return ctx
+	return event.WithExporter(context.Background(), eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(w)))
 }
 
 func BenchmarkLogEventNoExporter(b *testing.B) {
diff --git a/event/event_test.go b/event/event_test.go
index 3f64305..1d830ed 100644
--- a/event/event_test.go
+++ b/event/event_test.go
@@ -98,8 +98,7 @@
 time=2020-03-05T14:27:49 myString="some string value" msg="string event"
 `}} {
 		buf := &strings.Builder{}
-		ctx := event.WithExporter(ctx, event.NewExporter(logfmt.NewHandler(buf)))
-		eventtest.FixedNow(ctx)
+		ctx := event.WithExporter(ctx, eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(buf)))
 		test.events(ctx)
 		got := strings.TrimSpace(buf.String())
 		expect := strings.TrimSpace(test.expect)
@@ -110,8 +109,7 @@
 }
 
 func ExampleLog() {
-	ctx := event.WithExporter(context.Background(), event.NewExporter(logfmt.NewHandler(os.Stdout)))
-	eventtest.FixedNow(ctx)
+	ctx := event.WithExporter(context.Background(), eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(os.Stdout)))
 	event.To(ctx).With(keys.Int("myInt").Of(6)).Log("my event")
 	event.To(ctx).With(keys.String("myString").Of("some string value")).Log("error event")
 	// Output:
diff --git a/event/export.go b/event/export.go
index 84c6521..5366399 100644
--- a/event/export.go
+++ b/event/export.go
@@ -16,13 +16,24 @@
 
 // Exporter synchronizes the delivery of events to handlers.
 type Exporter struct {
-	Now func() time.Time
+	opts ExporterOptions
 
 	mu        sync.Mutex
 	handler   Handler
 	lastEvent uint64
 }
 
+type ExporterOptions struct {
+	// If non-nil, sets zero Event.At on delivery.
+	Now func() time.Time
+
+	// Disable some event types, for better performance.
+	DisableLogging     bool
+	DisableTracing     bool
+	DisableAnnotations bool
+	DisableMetrics     bool
+}
+
 // contextKey is used as the key for storing a contextValue on the context.
 type contextKeyType struct{}
 
@@ -42,7 +53,11 @@
 // NewExporter creates an Exporter using the supplied handler.
 // Event delivery is serialized to enable safe atomic handling.
 func NewExporter(handler Handler) *Exporter {
-	return &Exporter{Now: time.Now, handler: handler}
+	return (ExporterOptions{}).NewExporter(handler)
+}
+
+func (opts ExporterOptions) NewExporter(handler Handler) *Exporter {
+	return &Exporter{opts: opts, handler: handler}
 }
 
 func setDefaultExporter(e *Exporter) {
@@ -71,14 +86,12 @@
 // then the timestamp will be updated.
 // prepare must be called with the export mutex held.
 func (e *Exporter) prepare(ev *Event) {
-	if e.Now != nil && ev.At.IsZero() {
-		ev.At = e.Now()
+	if e.opts.Now != nil && ev.At.IsZero() {
+		ev.At = e.opts.Now()
 	}
 }
 
-//TODO: decide how to control the enable/disable behaviour
-
-func (e *Exporter) loggingEnabled() bool     { return true }
-func (e *Exporter) annotationsEnabled() bool { return true }
-func (e *Exporter) tracingEnabled() bool     { return true }
-func (e *Exporter) metricsEnabled() bool     { return true }
+func (e *Exporter) loggingEnabled() bool     { return !e.opts.DisableLogging }
+func (e *Exporter) annotationsEnabled() bool { return !e.opts.DisableAnnotations }
+func (e *Exporter) tracingEnabled() bool     { return !e.opts.DisableTracing }
+func (e *Exporter) metricsEnabled() bool     { return !e.opts.DisableMetrics }
diff --git a/event/logging/internal/internal.go b/event/logging/internal/internal.go
index c7b56aa..55abb20 100644
--- a/event/logging/internal/internal.go
+++ b/event/logging/internal/internal.go
@@ -34,7 +34,6 @@
 
 func NewTestExporter() (*event.Exporter, *TestHandler) {
 	te := &TestHandler{}
-	e := event.NewExporter(te)
-	e.Now = func() time.Time { return TestAt }
-	return e, te
+	opts := event.ExporterOptions{Now: func() time.Time { return TestAt }}
+	return opts.NewExporter(te), te
 }
diff --git a/event/severity/severity_test.go b/event/severity/severity_test.go
index f31f0cf..b2f0c8c 100644
--- a/event/severity/severity_test.go
+++ b/event/severity/severity_test.go
@@ -34,8 +34,7 @@
 		expect: `time=2020-03-05T14:27:48 level=info msg="a message"`},
 	} {
 		buf := &strings.Builder{}
-		ctx := event.WithExporter(ctx, event.NewExporter(logfmt.NewHandler(buf)))
-		eventtest.FixedNow(ctx)
+		ctx := event.WithExporter(ctx, eventtest.ExporterOptions().NewExporter(logfmt.NewHandler(buf)))
 		test.events(ctx)
 		got := strings.TrimSpace(buf.String())
 		expect := strings.TrimSpace(test.expect)
