diff --git a/src/core/SkBigPicture.cpp b/src/core/SkBigPicture.cpp
index 8cc8a2a..b81d9b3 100644
--- a/src/core/SkBigPicture.cpp
+++ b/src/core/SkBigPicture.cpp
@@ -77,7 +77,7 @@
 }
 
 void SkBigPicture::Analysis::init(const SkRecord& record) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkBitmapHunter bitmap;
     SkPathCounter  path;
 
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 8189df0..a3132ba 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1677,7 +1677,7 @@
 
 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner,
                           const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (outer.isEmpty()) {
         return;
     }
@@ -1933,7 +1933,7 @@
 }
 
 void SkCanvas::onDrawPaint(const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     this->internalDrawPaint(paint);
 }
 
@@ -1949,7 +1949,7 @@
 
 void SkCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) {
-    TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC, "count", static_cast<uint64_t>(count));
+    TRACE_EVENT1("skia", TRACE_FUNC, "count", static_cast<uint64_t>(count));
     if ((long)count <= 0) {
         return;
     }
@@ -1990,7 +1990,7 @@
 }
 
 void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkASSERT(r.isSorted());
     if (paint.canComputeFastBounds()) {
         SkRect storage;
@@ -2035,7 +2035,7 @@
 }
 
 void SkCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkASSERT(oval.isSorted());
     if (paint.canComputeFastBounds()) {
         SkRect storage;
@@ -2056,7 +2056,7 @@
 void SkCanvas::onDrawArc(const SkRect& oval, SkScalar startAngle,
                          SkScalar sweepAngle, bool useCenter,
                          const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkASSERT(oval.isSorted());
     if (paint.canComputeFastBounds()) {
         SkRect storage;
@@ -2076,7 +2076,7 @@
 }
 
 void SkCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (paint.canComputeFastBounds()) {
         SkRect storage;
         if (this->quickReject(paint.computeFastBounds(rrect.getBounds(), &storage))) {
@@ -2121,7 +2121,7 @@
 }
 
 void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (!path.isFinite()) {
         return;
     }
@@ -2172,7 +2172,7 @@
 }
 
 void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkRect bounds = SkRect::MakeXYWH(x, y,
                                      SkIntToScalar(image->width()), SkIntToScalar(image->height()));
     if (nullptr == paint || paint->canComputeFastBounds()) {
@@ -2221,7 +2221,7 @@
 
 void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
                                const SkPaint* paint, SrcRectConstraint constraint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (nullptr == paint || paint->canComputeFastBounds()) {
         SkRect storage = dst;
         if (paint) {
@@ -2247,7 +2247,7 @@
 }
 
 void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, const SkPaint* paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkDEBUGCODE(bitmap.validate();)
 
     if (bitmap.drawsNothing()) {
@@ -2331,14 +2331,14 @@
 
 void SkCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst,
                                 const SkPaint* paint, SrcRectConstraint constraint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkDEBUGCODE(bitmap.validate();)
     this->internalDrawBitmapRect(bitmap, src, dst, paint, constraint);
 }
 
 void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
                                const SkPaint* paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
 
     if (nullptr == paint || paint->canComputeFastBounds()) {
         SkRect storage;
@@ -2363,7 +2363,7 @@
 
 void SkCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst,
                                 const SkPaint* paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkDEBUGCODE(bitmap.validate();)
 
     if (nullptr == paint || paint->canComputeFastBounds()) {
@@ -2561,35 +2561,35 @@
 // These will become non-virtual, so they always call the (virtual) onDraw... method
 void SkCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
                         const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (byteLength) {
         this->onDrawText(text, byteLength, x, y, paint);
     }
 }
 void SkCanvas::drawPosText(const void* text, size_t byteLength, const SkPoint pos[],
                            const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (byteLength) {
         this->onDrawPosText(text, byteLength, pos, paint);
     }
 }
 void SkCanvas::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
                             SkScalar constY, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (byteLength) {
         this->onDrawPosTextH(text, byteLength, xpos, constY, paint);
     }
 }
 void SkCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
                               const SkMatrix* matrix, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (byteLength) {
         this->onDrawTextOnPath(text, byteLength, path, matrix, paint);
     }
 }
 void SkCanvas::drawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
                                const SkRect* cullRect, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (byteLength) {
         this->onDrawTextRSXform(text, byteLength, xform, cullRect, paint);
     }
@@ -2597,13 +2597,13 @@
 void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
                             const SkPaint& paint) {
     RETURN_ON_NULL(blob);
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     this->onDrawTextBlob(blob, x, y, paint);
 }
 
 void SkCanvas::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode bmode,
                                     const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr)
 
     while (iter.next()) {
@@ -2617,7 +2617,7 @@
 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4],
                          const SkPoint texCoords[4], SkBlendMode bmode,
                          const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (nullptr == cubics) {
         return;
     }
@@ -2707,7 +2707,7 @@
 //////////////////////////////////////////////////////////////////////////////
 
 void SkCanvas::drawColor(SkColor c, SkBlendMode mode) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkPaint paint;
 
     paint.setColor(c);
@@ -2716,13 +2716,13 @@
 }
 
 void SkCanvas::drawPoint(SkScalar x, SkScalar y, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     const SkPoint pt = { x, y };
     this->drawPoints(kPoints_PointMode, 1, &pt, paint);
 }
 
 void SkCanvas::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkPoint pts[2];
 
     pts[0].set(x0, y0);
@@ -2731,7 +2731,7 @@
 }
 
 void SkCanvas::drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (radius < 0) {
         radius = 0;
     }
@@ -2743,7 +2743,7 @@
 
 void SkCanvas::drawRoundRect(const SkRect& r, SkScalar rx, SkScalar ry,
                              const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (rx > 0 && ry > 0) {
         SkRRect rrect;
         rrect.setRectXY(r, rx, ry);
@@ -2756,7 +2756,7 @@
 void SkCanvas::drawArc(const SkRect& oval, SkScalar startAngle,
                        SkScalar sweepAngle, bool useCenter,
                        const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (oval.isEmpty() || !sweepAngle) {
         return;
     }
@@ -2766,7 +2766,7 @@
 void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength,
                                 const SkPath& path, SkScalar hOffset,
                                 SkScalar vOffset, const SkPaint& paint) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     SkMatrix    matrix;
 
     matrix.setTranslate(hOffset, vOffset);
@@ -2787,7 +2787,7 @@
 void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) {
     RETURN_ON_NULL(picture);
 
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (matrix && matrix->isIdentity()) {
         matrix = nullptr;
     }
diff --git a/src/core/SkTraceEvent.h b/src/core/SkTraceEvent.h
index 116330d..d4d0883 100644
--- a/src/core/SkTraceEvent.h
+++ b/src/core/SkTraceEvent.h
@@ -78,6 +78,10 @@
 // Defines visibility for classes in trace_event.h
 #define TRACE_EVENT_API_CLASS_EXPORT SK_API
 
+// We prepend this string to all category names, so that ALL Skia trace events are
+// disabled by default when tracing in Chrome.
+#define TRACE_CATEGORY_PREFIX "disabled-by-default-"
+
 ////////////////////////////////////////////////////////////////////////////////
 
 // Implementation detail: trace event macros create temporary variables
@@ -97,20 +101,18 @@
 #define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO_CUSTOM_VARIABLES( \
     category_group, atomic, category_group_enabled) \
     category_group_enabled = \
-        reinterpret_cast<const uint8_t*>(TRACE_EVENT_API_ATOMIC_LOAD( \
-            atomic)); \
+        reinterpret_cast<const uint8_t*>(TRACE_EVENT_API_ATOMIC_LOAD(atomic)); \
     if (!category_group_enabled) { \
-      category_group_enabled = \
-          TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(category_group); \
+      category_group_enabled = TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(category_group); \
       TRACE_EVENT_API_ATOMIC_STORE(atomic, \
-          reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>( \
-              category_group_enabled)); \
+          reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>(category_group_enabled)); \
     }
 
 #define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group) \
     static TRACE_EVENT_API_ATOMIC_WORD INTERNAL_TRACE_EVENT_UID(atomic) = 0; \
     const uint8_t* INTERNAL_TRACE_EVENT_UID(category_group_enabled); \
-    INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO_CUSTOM_VARIABLES(category_group, \
+    INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO_CUSTOM_VARIABLES( \
+        TRACE_CATEGORY_PREFIX category_group, \
         INTERNAL_TRACE_EVENT_UID(atomic), \
         INTERNAL_TRACE_EVENT_UID(category_group_enabled));
 
diff --git a/src/core/SkTraceEventCommon.h b/src/core/SkTraceEventCommon.h
index be705ee..dbce48f 100644
--- a/src/core/SkTraceEventCommon.h
+++ b/src/core/SkTraceEventCommon.h
@@ -54,12 +54,6 @@
 #error "Another copy of this file has already been included."
 #endif
 
-#define TRACE_DISABLED_BY_DEFAULT_PREFIX "disabled-by-default-"
-
-// This will mark the trace event as disabled by default. The user will need
-// to explicitly enable the event.
-#define TRACE_DISABLED_BY_DEFAULT(name) TRACE_DISABLED_BY_DEFAULT_PREFIX name
-
 // Records a pair of begin and end events called "name" for the current scope, with 0, 1 or 2
 // associated arguments. If the category is not enabled, then this does nothing.
 #define TRACE_EVENT0(category_group, name) \
diff --git a/src/gpu/GrBufferAllocPool.cpp b/src/gpu/GrBufferAllocPool.cpp
index 3096ae5..53e0d8c 100644
--- a/src/gpu/GrBufferAllocPool.cpp
+++ b/src/gpu/GrBufferAllocPool.cpp
@@ -30,7 +30,7 @@
 
 #define UNMAP_BUFFER(block)                                                               \
 do {                                                                                      \
-    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),                           \
+    TRACE_EVENT_INSTANT1("skia.gpu",                                                      \
                          "GrBufferAllocPool Unmapping Buffer",                            \
                          TRACE_EVENT_SCOPE_THREAD,                                        \
                          "percent_unwritten",                                             \
diff --git a/src/gpu/GrDrawOpAtlas.cpp b/src/gpu/GrDrawOpAtlas.cpp
index 4904e24..8bc0521 100644
--- a/src/gpu/GrDrawOpAtlas.cpp
+++ b/src/gpu/GrDrawOpAtlas.cpp
@@ -131,7 +131,7 @@
                                           GrTexture* texture) {
     // We should only be issuing uploads if we are in fact dirty
     SkASSERT(fDirty && fData && texture);
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), TRACE_FUNC);
+    TRACE_EVENT0("skia.gpu", TRACE_FUNC);
     size_t rowBytes = fBytesPerPixel * fWidth;
     const unsigned char* dataPtr = fData;
     dataPtr += rowBytes * fDirtyRect.fTop;
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index 7c371a8..5c4cd57 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -117,7 +117,7 @@
     if (SkBudgeted::kYes == resource->resourcePriv().isBudgeted()) {
         ++fBudgetedCount;
         fBudgetedBytes += size;
-        TRACE_COUNTER2(TRACE_DISABLED_BY_DEFAULT("skia.gpu.cache"), "skia budget", "used",
+        TRACE_COUNTER2("skia.gpu.cache", "skia budget", "used",
                        fBudgetedBytes, "free", fMaxBytes - fBudgetedBytes);
 #if GR_CACHE_STATS
         fBudgetedHighWaterCount = SkTMax(fBudgetedCount, fBudgetedHighWaterCount);
@@ -150,7 +150,7 @@
     if (SkBudgeted::kYes == resource->resourcePriv().isBudgeted()) {
         --fBudgetedCount;
         fBudgetedBytes -= size;
-        TRACE_COUNTER2(TRACE_DISABLED_BY_DEFAULT("skia.gpu.cache"), "skia budget", "used",
+        TRACE_COUNTER2("skia.gpu.cache", "skia budget", "used",
                        fBudgetedBytes, "free", fMaxBytes - fBudgetedBytes);
     }
 
@@ -419,7 +419,7 @@
 #endif
     if (SkBudgeted::kYes == resource->resourcePriv().isBudgeted()) {
         fBudgetedBytes += delta;
-        TRACE_COUNTER2(TRACE_DISABLED_BY_DEFAULT("skia.gpu.cache"), "skia budget", "used",
+        TRACE_COUNTER2("skia.gpu.cache", "skia budget", "used",
                        fBudgetedBytes, "free", fMaxBytes - fBudgetedBytes);
 #if GR_CACHE_STATS
         fBudgetedHighWaterBytes = SkTMax(fBudgetedBytes, fBudgetedHighWaterBytes);
@@ -448,7 +448,7 @@
         --fBudgetedCount;
         fBudgetedBytes -= size;
     }
-    TRACE_COUNTER2(TRACE_DISABLED_BY_DEFAULT("skia.gpu.cache"), "skia budget", "used",
+    TRACE_COUNTER2("skia.gpu.cache", "skia budget", "used",
                    fBudgetedBytes, "free", fMaxBytes - fBudgetedBytes);
 
     this->validate();
diff --git a/src/gpu/GrTracing.h b/src/gpu/GrTracing.h
index ff7d6e3..6a6916a 100644
--- a/src/gpu/GrTracing.h
+++ b/src/gpu/GrTracing.h
@@ -64,13 +64,12 @@
     /* Chromium tracing */                                                                         \
     static int SK_MACRO_APPEND_LINE(name_counter) = 0;                                             \
     bool SK_MACRO_APPEND_LINE(gpuTracingEnabled);                                                  \
-    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),                      \
+    TRACE_EVENT_CATEGORY_GROUP_ENABLED("skia.gpu",                                                 \
                                        &SK_MACRO_APPEND_LINE(gpuTracingEnabled));                  \
     if (SK_MACRO_APPEND_LINE(gpuTracingEnabled)) {                                                 \
         INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, SK_MACRO_APPEND_LINE(name_counter), target)   \
     }                                                                                              \
-    INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), name,                   \
-                                    "id", SK_MACRO_APPEND_LINE(name_counter));
+    INTERNAL_TRACE_EVENT_ADD_SCOPED("skia.gpu", name, "id", SK_MACRO_APPEND_LINE(name_counter));
 
 #define INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED(name, name_counter, target)        \
     static const char* SK_MACRO_APPEND_LINE(static_name) = name;                  \
@@ -94,14 +93,14 @@
     /* Chromium tracing */                                                                         \
     static int SK_MACRO_APPEND_LINE(name_counter) = 0;                                             \
     bool SK_MACRO_APPEND_LINE(gpuTracingEnabled);                                                  \
-    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"),                      \
+    TRACE_EVENT_CATEGORY_GROUP_ENABLED("skia.gpu",                                                 \
                                        &SK_MACRO_APPEND_LINE(gpuTracingEnabled));                  \
     if (SK_MACRO_APPEND_LINE(gpuTracingEnabled)) {                                                 \
         INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(classname "::" op,                                \
                                                  SK_MACRO_APPEND_LINE(name_counter), context)      \
     }                                                                                              \
     GR_AUDIT_TRAIL_AUTO_FRAME(context->getAuditTrail(), classname "::" op);                        \
-    INTERNAL_TRACE_EVENT_ADD_SCOPED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), classname "::" op,      \
+    INTERNAL_TRACE_EVENT_ADD_SCOPED("skia.gpu", classname "::" op,                                 \
                                     "id", SK_MACRO_APPEND_LINE(name_counter));
 
 #define INTERNAL_GR_CREATE_TRACE_MARKER_SCOPED_C(name, name_counter, context)     \
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 5c39d08..5209e3e 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -3459,7 +3459,7 @@
 }
 
 bool GrGLGpu::createCopyProgram(GrTexture* srcTex) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
 
     int progIdx = TextureToCopyProgramIdx(srcTex);
     const GrShaderCaps* shaderCaps = this->caps()->shaderCaps();
@@ -3738,7 +3738,7 @@
 }
 
 bool GrGLGpu::createStencilClipClearProgram() {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
 
     if (!fStencilClipClearArrayBuffer) {
         static const GrGLfloat vdata[] = {-1, -1, 1, -1, -1, 1, 1, 1};
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 6326550..dc70bd6 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -98,7 +98,7 @@
 }
 
 GrGLProgram* GrGLProgramBuilder::finalize() {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
 
     // verify we can get a program id
     GrGLuint programID;
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
index 92e3ffa..3273218 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
@@ -106,14 +106,14 @@
 
     // Trace event for shader preceding driver compilation
     bool traceShader;
-    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), &traceShader);
+    TRACE_EVENT_CATEGORY_GROUP_ENABLED("skia.gpu", &traceShader);
     if (traceShader) {
         SkString shaderDebugString;
         print_shaders_line_by_line(skslStrings, lengths, count, glsl, [&](const char* ln) {
             shaderDebugString.append(ln);
             shaderDebugString.append("\n");
         });
-        TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "skia_gpu::GLShader",
+        TRACE_EVENT_INSTANT1("skia.gpu", "skia_gpu::GLShader",
                              TRACE_EVENT_SCOPE_THREAD, "shader",
                              TRACE_STR_COPY(shaderDebugString.c_str()));
     }
diff --git a/src/gpu/vk/GrVkCopyManager.cpp b/src/gpu/vk/GrVkCopyManager.cpp
index 08eb4f0..47c17ab 100644
--- a/src/gpu/vk/GrVkCopyManager.cpp
+++ b/src/gpu/vk/GrVkCopyManager.cpp
@@ -34,7 +34,7 @@
 GrVkCopyManager::~GrVkCopyManager() {}
 
 bool GrVkCopyManager::createCopyProgram(GrVkGpu* gpu) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
 
     const GrShaderCaps* shaderCaps = gpu->caps()->shaderCaps();
     const char* version = shaderCaps->versionDeclString();
diff --git a/src/pdf/SkDeflate.cpp b/src/pdf/SkDeflate.cpp
index 98ebed3..6952ec4 100644
--- a/src/pdf/SkDeflate.cpp
+++ b/src/pdf/SkDeflate.cpp
@@ -85,7 +85,7 @@
 SkDeflateWStream::~SkDeflateWStream() { this->finalize(); }
 
 void SkDeflateWStream::finalize() {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (!fImpl->fOut) {
         return;
     }
@@ -96,7 +96,7 @@
 }
 
 bool SkDeflateWStream::write(const void* void_buffer, size_t len) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia"), TRACE_FUNC);
+    TRACE_EVENT0("skia", TRACE_FUNC);
     if (!fImpl->fOut) {
         return false;
     }
diff --git a/tools/trace/SkEventTracingPriv.cpp b/tools/trace/SkEventTracingPriv.cpp
index 42d992c..7a9ca2e 100644
--- a/tools/trace/SkEventTracingPriv.cpp
+++ b/tools/trace/SkEventTracingPriv.cpp
@@ -12,7 +12,7 @@
 #include "SkCommandLineFlags.h"
 #include "SkDebugfTracer.h"
 #include "SkEventTracer.h"
-#include "SkTraceEventCommon.h"
+#include "SkTraceEvent.h"
 
 DEFINE_string(trace, "",
               "Log trace events in one of several modes:\n"
@@ -42,17 +42,17 @@
     SkAssertResult(SkEventTracer::SetInstance(eventTracer));
 }
 
-uint8_t* SkEventTracingCategories::getCategoryGroupEnabled(const char* name) {
-    static_assert(0 == offsetof(CategoryState, fEnabled), "CategoryState");
-
-    // We ignore the "disabled-by-default-" prefix in our internal tools (though we could honor it)
-    if (SkStrStartsWith(name, TRACE_DISABLED_BY_DEFAULT_PREFIX)) {
-        name += strlen(TRACE_DISABLED_BY_DEFAULT_PREFIX);
-    }
-
-    // Chrome's implementation of this API does a two-phase lookup (once without a lock, then again
-    // with a lock. But the tracing macros avoid calling these functions more than once per site,
-    // so just do something simple (and easier to reason about):
+uint8_t* SkEventTracingCategories::getCategoryGroupEnabled(const char* name) {
+    static_assert(0 == offsetof(CategoryState, fEnabled), "CategoryState");
+
+    // We ignore the "disabled-by-default-" prefix in our internal tools
+    if (SkStrStartsWith(name, TRACE_CATEGORY_PREFIX)) {
+        name += strlen(TRACE_CATEGORY_PREFIX);
+    }
+
+    // Chrome's implementation of this API does a two-phase lookup (once without a lock, then again
+    // with a lock. But the tracing macros avoid calling these functions more than once per site,
+    // so just do something simple (and easier to reason about):
     SkAutoMutexAcquire lock(&fMutex);
     for (int i = 0; i < fNumCategories; ++i) {
         if (0 == strcmp(name, fCategories[i].fName)) {
@@ -71,7 +71,7 @@
     return reinterpret_cast<uint8_t*>(&fCategories[fNumCategories++]);
 }
 
-const char* SkEventTracingCategories::getCategoryGroupName(const uint8_t* categoryEnabledFlag) {
+const char* SkEventTracingCategories::getCategoryGroupName(const uint8_t* categoryEnabledFlag) {
     if (categoryEnabledFlag) {
         return reinterpret_cast<const CategoryState*>(categoryEnabledFlag)->fName;
     }
