diff --git a/fgpyo/util/metric.py b/fgpyo/util/metric.py
index e9b91eee..823622d9 100644
--- a/fgpyo/util/metric.py
+++ b/fgpyo/util/metric.py
@@ -116,6 +116,7 @@
 
 """
 
+import dataclasses
 from abc import ABC
 from enum import Enum
 from pathlib import Path
@@ -127,6 +128,8 @@
 from typing import List
 from typing import TypeVar
 
+import attr
+
 from fgpyo import io
 from fgpyo.util import inspect
 
@@ -334,3 +337,14 @@ def fast_concat(*inputs: Path, output: Path) -> None:
             io.write_lines(
                 path=output, lines_to_write=list(io.read_lines(input_path))[1:], append=True
             )
+
+
+def asdict(metric: Metric) -> dict[str, Any]:
+    """Convert a Metric instance to a dictionary."""
+
+    if dataclasses.is_dataclass(metric):
+        return dataclasses.asdict(metric)
+    elif attr.has(metric):
+        return attr.asdict(metric)
+    else:
+        assert False, "Unreachable"