Telemetry fixes

Null pointer check made for preventing a simple crash.

To make the code simpler, removed service hash map and modified the ordered service list to contain both the service path and pointer to service. This way we don't need to keep two separate data structures in sync. Most of the code accesses all the hash keys in linear order, retrieving a single value by key is used only in a couple of places, and the number of services is never very large so there should not be a big performance impact.