Reach for metrics when you want to know the overall health and trend of a system: error rate climbing, latency creeping up, a queue backing up, a disk filling. They are cheap to store, fast to query, and perfect for dashboards and alerts because a number aggregated across millions of requests still costs almost nothing.
The cost of that cheapness is that metrics throw away detail. A p99 latency of 2 seconds tells you something is slow but not which user, which trace, or why. That is where logs and distributed traces take over. The common practice is to alert on metrics, then jump to traces and logs to find the root cause of the specific request that misbehaved.
The main failure mode is cardinality explosion. Cardinality is the number of unique label combinations, and each one is a separate time series the database must hold in memory. Putting a high variety value like user ID, email, or full URL in a label can create millions of series and crash the monitoring system. Keep labels low cardinality, with bounded values like status code or region, and never put raw identifiers in them.