make @trace decorator support async functions (#92)

Co-authored-by: Zhenxu Ke <kezhenxu94@apache.org>
diff --git a/skywalking/decorators.py b/skywalking/decorators.py
index a48e057..444c7a5 100644
--- a/skywalking/decorators.py
+++ b/skywalking/decorators.py
@@ -17,6 +17,7 @@
 
 from functools import wraps
 from typing import List
+import inspect
 
 from skywalking import Layer, Component
 from skywalking.trace.context import get_context
@@ -30,22 +31,37 @@
         tags: List[Tag] = None,
 ):
     def decorator(func):
-        @wraps(func)
-        def wrapper(*args, **kwargs):
-            _op = op or func.__name__
-            context = get_context()
-            with context.new_local_span(op=_op) as span:
-                span.layer = layer
-                span.component = component
-                [span.tag(tag) for tag in tags or []]
-                try:
-                    result = func(*args, **kwargs)
-                    return result
-                except Exception:
-                    span.raised()
-                    raise
+        _op = op or func.__name__
+        context = get_context()
+        if inspect.iscoroutinefunction(func):
+            @wraps(func)
+            async def wrapper(*args, **kwargs):
+                with context.new_local_span(op=_op) as span:
+                    span.layer = layer
+                    span.component = component
+                    [span.tag(tag) for tag in tags or []]
+                    try:
+                        result = func(*args, **kwargs)
+                        return await result
+                    except Exception:
+                        span.raised()
+                        raise
+            return wrapper
 
-        return wrapper
+        else:
+            @wraps(func)
+            def wrapper(*args, **kwargs):
+                with context.new_local_span(op=_op) as span:
+                    span.layer = layer
+                    span.component = component
+                    [span.tag(tag) for tag in tags or []]
+                    try:
+                        result = func(*args, **kwargs)
+                        return result
+                    except Exception:
+                        span.raised()
+                        raise
+            return wrapper
 
     return decorator