AS
trait Logger[F[_], service <: Singleton with String]
class FooService[F[_]](implicit log: Logger[F, «foo-service»])
ну и потом такой вот логгер создать.
а значение этого типа можно через ValueOf достать, чтобы в метрики писать потом:
val saveMetrics[service <: Singleton with String](implicit vo: ValueOf[service]) = save(vo.value)
saveMetrics[«kek»] //в vo.value будет строка «кек»
зачем — чтобы не накосячить во всяких именах или чтобы работал имплисит резолюшн.
Метрики мы например текаем обжектами-компаньонами соответствующего класса