I think PrometheusAlertChannel is a good name for the trait. However both function names feel off :
typetag doesn't seem to be a good idea here. Why do you use it? Show me an actual use case that requires it versus having a trait bound + Serialize on the PrometheusAlertChannel trait.
Yeah I don't think this will work. Show me the actual json that this produces and why you need to use this.
Much better than previous iteration. But still a lot of room for improvement.
Is this really required? This feels wrong, at least it would deserve a small comment explaining why you are ALWAYS instanciating a hardcoded NullReceiver
Why is all this config hardcoded? Shouldn't it be exposed in the Score's configuration? I think it should have defaults so that users are not forced to set everything by themselves but it should not be hardcoded.