=tes #15165 MetricsKit should not nullpointer on racy graphite usage

The report() call can come from multiple threads in our code,
yet it was opening/closing a shared graphite client instance in this
method. With the scheduled reporting + manual triggering races could
happen (close/open socket connection, which nulled fields too (inside metric's code).

Graphite's internal socket is now reused among writers; The
graphite.send must be synchronised due to this. Implementing a client by
hand seems more tempting again...

Resolves #15165