public TraceAs(string serviceName, string message, OperationType operationType, Dictionary <string, string> tags = null, bool hasInnerTrace = false)
        {
            try
            {
                _hasInnerTrace   = hasInnerTrace;
                zipkinAnnotation = ZipkinAnnotationFactory.GetAnnotationObject(operationType);

                trace = Trace.Current == null?Trace.Create() : Trace.Current.Child();

                trace.Record(Annotations.ServiceName(serviceName));
                trace.Record(zipkinAnnotation.AnnotationStart(message));
                trace.Record(Annotations.Rpc(message));
                if (tags != null)
                {
                    foreach (var key in tags.Keys)
                    {
                        trace.Record(Annotations.Tag(key, tags[key]));
                    }
                }

                if (hasInnerTrace)
                {
                    Trace.Current = trace;
                }
            }
            catch (Exception e)
            {
            }
        }
        public static IZipkinAnnotation GetAnnotationObject(OperationType operationType)
        {
            IZipkinAnnotation zipkinAnnotation = null;

            switch (operationType)
            {
            case OperationType.LocalOperation:
                zipkinAnnotation = new ZipkinLocalOperationAnnotation();
                break;

            case OperationType.Client:
                zipkinAnnotation = new ZipkinClientAnnotations();
                break;

            case OperationType.Server:
                zipkinAnnotation = new ZipkinServerAnnotations();
                break;
            }

            return(zipkinAnnotation);
        }