Use "labels per user". Do not put multiple unrelated concerns into the metric name.
If you use http_3rdParty1_requests_total
as the metric name you have putting two values, concatenated into one text field: the client name and the metric name are joined together.
If you designed a SQL database that way, e.g. with "customer last name + bank branch name" stored in one text field, we would think that you are making a rookie mistake and tell you to store two values in two fields, each with a meaningful name, and not one field with two values smushed into it. This isn't much different.
Metric name is really just another label with a special name, i.e. internally it is __name__ ="http-requests_total"
You don't get around cardinality by putting data in the name rather than in it's own label. That won't change the cardinality at all. With over 600 unique values, you might have problems either way.
But storing two different values in two fields, not one, is still the right way to do it, and will save you trouble later when making queries. e.g. With a separate label such as user="3rdParty1"
you can craft queries such as: how many users were active in the last 24 hours? Show me graphs of http request volume per user. Show me users that had 10 or more errors in the last hour. Show me all metrics for this user.
See:
The correct way to handle this is to use a label to distinguish the different pools, rather than encoding them inside the metric name
https://www.robustperception.io/whats-in-a-\_\_name__
This is however not the way to handle things in Prometheus whose labels provide a more powerful data model.
https://www.robustperception.io/target-labels-not-metric-name-prefixes
You might try putting the path in the metric name, such as is common in Graphite ... Accordingly, this is an antipattern you should avoid. Instead, to handle this common use case, Prometheus has labels.
https://www.oreilly.com/library/view/prometheus-up/9781492034131/ch05.html