add flag to makesure Tracer:finish called (#85)

diff --git a/CHANGES.md b/CHANGES.md
index 0b6466f..df4ffb4 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,9 @@
 # Changes
 
+## 0.6.0
+
+1. fix: `skywalking_tracer:finish()` will not be called in some case such as upstream timeout.
+
 ## 0.5.0
 
 1. Adapt to Kong agent.
diff --git a/lib/skywalking/tracer.lua b/lib/skywalking/tracer.lua
index 88941b2..5bf8a88 100644
--- a/lib/skywalking/tracer.lua
+++ b/lib/skywalking/tracer.lua
@@ -79,21 +79,26 @@
     ctx.tracingContext = tracingContext
     ctx.entrySpan = entrySpan
     ctx.exitSpan = exitSpan
+    ctx.is_finished = false
 end
 
 function Tracer:finish()
     -- Finish the exit span when received the first response package from upstream
-    if ngx.ctx.exitSpan ~= nil then
+    if ngx.ctx.exitSpan ~= nil and not ngx.ctx.is_finished then
         local upstream_status = tonumber(ngx.var.upstream_status)
         if upstream_status then
             Span.tag(ngx.ctx.exitSpan, 'http.status', upstream_status)
         end
         Span.finish(ngx.ctx.exitSpan, ngx.now() * 1000)
         ngx.ctx.exitSpan = nil
+        ngx.ctx.is_finished = true
     end
 end
 
 function Tracer:prepareForReport()
+    if not ngx.ctx.is_finished then
+        self.finish()
+    end
     local entrySpan = ngx.ctx.entrySpan
     if not entrySpan then
         return