/// <summary>
        /// Finds an existing <see cref="TimerTracer"/> and marks it as complete.
        /// </summary>
        /// <param name="context">Current trace context for lifetime scope (request).</param>
        /// <param name="name">Unique name of the timer. Usually related to the current operation being performed. Must contain alphanumeric and hyphen characters only.</param>
        public static void CompleteTimerTracer(this ITraceContext context, string name)
        {
            TraceContext.EnsureValidTracerName(name);
            TracerBase tracer;

            if (!context.Tracers.TryGetValue(name, out tracer))
            {
                return;
            }

            var typedTracer = tracer as TimerTracer;

            typedTracer?.Complete();
        }
        /// <summary>
        /// Creates and starts a timer tracer attached to current request.
        /// </summary>
        /// <param name="context">Current trace context for lifetime scope (request).</param>
        /// <param name="name">Unique name of the timer. Usually related to the current operation being performed. Must contain alphanumeric and hyphen characters only.</param>
        /// <returns><see cref="TracerBase"/> that represents a <see cref="TimerTracer"/>.</returns>
        public static TracerBase StartTimerTracer(this ITraceContext context, string name)
        {
            TraceContext.EnsureValidTracerName(name);

            if (context.Tracers.ContainsKey(name))
            {
                var existingTracer = context.Tracers[name] as TimerTracer;
                existingTracer?.Complete();

                var replacementTracer = new TimerTracer();
                context.Tracers[name] = replacementTracer;
                return(replacementTracer);
            }

            var tracer = new TimerTracer();

            context.Tracers.Add(name, tracer);
            return(tracer);
        }