/// <summary>
        /// Adds the specified message to the trace context and will output the message on the response.
        /// </summary>
        /// <param name="context">Current trace context for lifetime scope (request).</param>
        /// <param name="name">Unique name of the tracer. Usually related to the current operation being performed. Must contain alphanumeric and hyphen characters only.</param>
        /// <param name="message"></param>
        public static void WriteMessageTracer(this ITraceContext context, string name, string message)
        {
            TraceContext.EnsureValidTracerName(name);

            var traceContext = (TraceContext)context;
            var tracer       = new MessageTracer(message);

            traceContext.Tracers.Add(name, tracer);
        }
        /// <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);
        }