const char *metric_id;
        struct evsel *ev;
        size_t ids_size, matched_events, i;
-       bool all_pmus = !strcmp(pmu, "all");
+       bool all_pmus = !strcmp(pmu, "all") || !perf_pmu__is_hybrid(pmu);
 
        *out_metric_events = NULL;
        ids_size = hashmap__size(ids);
        evlist__for_each_entry(metric_evlist, ev) {
                struct expr_id_data *val_ptr;
 
-               if (!all_pmus && strcmp(ev->pmu_name, pmu))
+               /* Don't match events for the wrong hybrid PMU. */
+               if (!all_pmus && ev->pmu_name &&
+                   perf_pmu__is_hybrid(ev->pmu_name) &&
+                   strcmp(ev->pmu_name, pmu))
                        continue;
                /*
                 * Check for duplicate events with the same name. For
                 * about this event.
                 */
                if (hashmap__find(ids, metric_id, &val_ptr)) {
+                       pr_debug("Matched metric-id %s to %s\n", metric_id, evsel__name(ev));
                        metric_events[matched_events++] = ev;
 
                        if (matched_events >= ids_size)
                ret = setup_metric_events(fake_pmu ? "all" : m->pmu, m->pctx->ids,
                                          metric_evlist, &metric_events);
                if (ret) {
-                       pr_debug("Cannot resolve IDs for %s: %s\n",
+                       pr_err("Cannot resolve IDs for %s: %s\n",
                                m->metric_name, m->metric_expr);
                        goto out;
                }