exporter/jaeger: ensure non-zero status code sets error tag

During conversion from OpenCensus-Go SpanData to Jaeger spans,
ensure that if a Status' code is non-zero (0 being "OK"
according to the OpenCensus data model), that we set the
"error" tag on the corresponding Jaeger span.

Fixes #1041
diff --git a/exporter/jaeger/jaeger.go b/exporter/jaeger/jaeger.go
index e63a099..322735a 100644
--- a/exporter/jaeger/jaeger.go
+++ b/exporter/jaeger/jaeger.go
@@ -192,6 +192,11 @@
 	// TODO(jbd): Handle oversized bundlers.
 }
 
+// As per the OpenCensus Status code mapping in
+//    https://opencensus.io/tracing/span/status/
+// the status is OK if the code is 0.
+const opencensusStatusCodeOK = 0
+
 func spanDataToThrift(data *trace.SpanData) *gen.Span {
 	tags := make([]*gen.Tag, 0, len(data.Attributes))
 	for k, v := range data.Attributes {
@@ -206,6 +211,12 @@
 		attributeToTag("status.message", data.Status.Message),
 	)
 
+	// Ensure that if Status.Code is not OK, that we set the "error" tag on the Jaeger span.
+	// See Issue https://github.com/census-instrumentation/opencensus-go/issues/1041
+	if data.Status.Code != opencensusStatusCodeOK {
+		tags = append(tags, attributeToTag("error", true))
+	}
+
 	var logs []*gen.Log
 	for _, a := range data.Annotations {
 		fields := make([]*gen.Tag, 0, len(a.Attributes))
diff --git a/exporter/jaeger/jaeger_test.go b/exporter/jaeger/jaeger_test.go
index ab3ce5a..f93b5dd 100644
--- a/exporter/jaeger/jaeger_test.go
+++ b/exporter/jaeger/jaeger_test.go
@@ -64,6 +64,7 @@
 	resultValue := true
 	statusCodeValue := int64(2)
 	doubleValue := float64(123.456)
+	boolTrue := true
 	statusMessage := "error"
 
 	tests := []struct {
@@ -113,6 +114,7 @@
 				Tags: []*gen.Tag{
 					{Key: "double", VType: gen.TagType_DOUBLE, VDouble: &doubleValue},
 					{Key: "key", VType: gen.TagType_STRING, VStr: &keyValue},
+					{Key: "error", VType: gen.TagType_BOOL, VBool: &boolTrue},
 					{Key: "status.code", VType: gen.TagType_LONG, VLong: &statusCodeValue},
 					{Key: "status.message", VType: gen.TagType_STRING, VStr: &statusMessage},
 				},
@@ -139,7 +141,7 @@
 				return tt.want.Tags[i].Key < tt.want.Tags[j].Key
 			})
 			if !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("spanDataToThrift() = %v, want %v", got, tt.want)
+				t.Errorf("spanDataToThrift()\nGot:\n%v\nWant;\n%v", got, tt.want)
 			}
 		})
 	}