You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@htrace.apache.org by cm...@apache.org on 2015/01/05 17:56:20 UTC

incubator-htrace git commit: HTRACE-52. Set content-type in htraced JSON API (cmccabe)

Repository: incubator-htrace
Updated Branches:
  refs/heads/master 3e6288491 -> bbe0c6c87


HTRACE-52. Set content-type in htraced JSON API (cmccabe)


Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/bbe0c6c8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/bbe0c6c8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/bbe0c6c8

Branch: refs/heads/master
Commit: bbe0c6c87c7facf062e33caaad85a3ec93a7ab91
Parents: 3e62884
Author: Colin P. Mccabe <cm...@apache.org>
Authored: Sun Jan 4 23:34:53 2015 -0800
Committer: Colin P. Mccabe <cm...@apache.org>
Committed: Mon Jan 5 08:56:14 2015 -0800

----------------------------------------------------------------------
 .../src/go/src/org/apache/htrace/common/span.go |  2 +-
 .../src/go/src/org/apache/htrace/htrace/cmd.go  | 15 +++----
 .../go/src/org/apache/htrace/htraced/rest.go    | 42 +++++++++++++-------
 3 files changed, 36 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/bbe0c6c8/htrace-core/src/go/src/org/apache/htrace/common/span.go
----------------------------------------------------------------------
diff --git a/htrace-core/src/go/src/org/apache/htrace/common/span.go b/htrace-core/src/go/src/org/apache/htrace/common/span.go
index 4efc101..20d3e45 100644
--- a/htrace-core/src/go/src/org/apache/htrace/common/span.go
+++ b/htrace-core/src/go/src/org/apache/htrace/common/span.go
@@ -46,7 +46,7 @@ type TimelineAnnotation struct {
 type SpanId int64
 
 func (id SpanId) String() string {
-	return fmt.Sprintf("%016x", id)
+	return fmt.Sprintf("%016x", uint64(id))
 }
 
 func (id SpanId) Val() int64 {

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/bbe0c6c8/htrace-core/src/go/src/org/apache/htrace/htrace/cmd.go
----------------------------------------------------------------------
diff --git a/htrace-core/src/go/src/org/apache/htrace/htrace/cmd.go b/htrace-core/src/go/src/org/apache/htrace/htrace/cmd.go
index d3129e4..c1ef249 100644
--- a/htrace-core/src/go/src/org/apache/htrace/htrace/cmd.go
+++ b/htrace-core/src/go/src/org/apache/htrace/htrace/cmd.go
@@ -45,10 +45,10 @@ func main() {
 	serverInfo := app.Command("serverInfo", "Print information retrieved from an htraced server.")
 	findSpan := app.Command("findSpan", "Print information about a trace span with a given ID.")
 	findSpanId := findSpan.Flag("id", "Span ID to find, as a signed decimal 64-bit "+
-		"number").Required().Int64()
+		"number").Required().Uint64()
 	findChildren := app.Command("findChildren", "Print out the span IDs that are children of a given span ID.")
 	parentSpanId := findChildren.Flag("id", "Span ID to print children for, as a signed decimal 64-bit "+
-		"number").Required().Int64()
+		"number").Required().Uint64()
 	childLim := findChildren.Flag("lim", "Maximum number of child IDs to print.").Default("20").Int()
 	writeSpans := app.Command("writeSpans", "Write spans to the server in JSON form.")
 	spanJson := writeSpans.Flag("json", "The JSON span data to write to the server.").Required().String()
@@ -95,8 +95,8 @@ func printServerInfo(restAddr string) int {
 }
 
 // Print information about a trace span.
-func doFindSpan(restAddr string, sid int64) int {
-	buf, err := makeGetRequest(restAddr, fmt.Sprintf("%016x", sid))
+func doFindSpan(restAddr string, sid uint64) int {
+	buf, err := makeGetRequest(restAddr, fmt.Sprintf("span/%016x", sid))
 	if err != nil {
 		fmt.Printf("%s\n", err.Error())
 		return 1
@@ -128,13 +128,13 @@ func doWriteSpans(restAddr string, spanJson string) int {
 }
 
 // Find information about the children of a span.
-func doFindChildren(restAddr string, sid int64, lim int) int {
-	buf, err := makeGetRequest(restAddr, fmt.Sprintf("%016x/children&lim=%d", sid, lim))
+func doFindChildren(restAddr string, sid uint64, lim int) int {
+	buf, err := makeGetRequest(restAddr, fmt.Sprintf("span/%016x/children?lim=%d", sid, lim))
 	if err != nil {
 		fmt.Printf("%s\n", err.Error())
 		return 1
 	}
-	var spanIds []int64
+	var spanIds []common.SpanId
 	err = json.Unmarshal(buf, &spanIds)
 	if err != nil {
 		fmt.Printf("Error: error unmarshalling response body %s: %s\n",
@@ -159,6 +159,7 @@ func makeRestRequest(reqType string, restAddr string, reqName string,
 	reqBody io.Reader) ([]byte, error) {
 	url := fmt.Sprintf("http://%s/%s", restAddr, reqName)
 	req, err := http.NewRequest(reqType, url, reqBody)
+	req.Header.Set("Content-Type", "application/json")
 	client := &http.Client{}
 	resp, err := client.Do(req)
 	if err != nil {

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/bbe0c6c8/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go
----------------------------------------------------------------------
diff --git a/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go b/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go
index 9f22de9..744a5b6 100644
--- a/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go
+++ b/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go
@@ -21,6 +21,7 @@ package main
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/gorilla/mux"
 	"io"
 	"log"
@@ -34,16 +35,31 @@ import (
 	"strings"
 )
 
+// Set the response headers.
+func setResponseHeaders(hdr http.Header) {
+	hdr.Set("Content-Type", "application/json")
+}
+
+// Write a JSON error response.
+func writeError(w http.ResponseWriter, errCode int, fstr string, args ...interface{}) {
+	str := fmt.Sprintf(fstr, args)
+	str = strings.Replace(str, `"`, `'`, -1)
+	log.Println(str)
+	w.WriteHeader(errCode)
+	w.Write([]byte(`{ "error" : "` + str + `"}`))
+}
+
 type serverInfoHandler struct {
 }
 
 func (handler *serverInfoHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	setResponseHeaders(w.Header())
 	version := common.ServerInfo{ReleaseVersion: common.RELEASE_VERSION,
 		GitVersion: common.GIT_VERSION}
 	buf, err := json.Marshal(&version)
 	if err != nil {
-		log.Printf("error marshalling ServerInfo: %s\n", err.Error())
-		w.WriteHeader(http.StatusInternalServerError)
+		writeError(w, http.StatusInternalServerError,
+			"error marshalling ServerInfo: %s\n", err.Error())
 		return
 	}
 	w.Write(buf)
@@ -56,7 +72,8 @@ type dataStoreHandler struct {
 func (hand *dataStoreHandler) parse64(w http.ResponseWriter, str string) (int64, bool) {
 	val, err := strconv.ParseUint(str, 16, 64)
 	if err != nil {
-		w.WriteHeader(http.StatusBadRequest)
+		writeError(w, http.StatusBadRequest, "Failed to parse span ID %s: %s",
+			str, err.Error())
 		w.Write([]byte("Error parsing : " + err.Error()))
 		return -1, false
 	}
@@ -67,14 +84,12 @@ func (hand *dataStoreHandler) getReqField32(fieldName string, w http.ResponseWri
 	req *http.Request) (int32, bool) {
 	str := req.FormValue(fieldName)
 	if str == "" {
-		w.WriteHeader(http.StatusBadRequest)
-		w.Write([]byte("No " + fieldName + " specified."))
+		writeError(w, http.StatusBadRequest, "No %s specified.", fieldName)
 		return -1, false
 	}
 	val, err := strconv.ParseUint(str, 16, 32)
 	if err != nil {
-		w.WriteHeader(http.StatusBadRequest)
-		w.Write([]byte("Error parsing " + fieldName + ": " + err.Error()))
+		writeError(w, http.StatusBadRequest, "Error parsing %s: %s.", fieldName, err.Error())
 		return -1, false
 	}
 	return int32(val), true
@@ -85,6 +100,7 @@ type findSidHandler struct {
 }
 
 func (hand *findSidHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	setResponseHeaders(w.Header())
 	req.ParseForm()
 	vars := mux.Vars(req)
 	stringSid := vars["id"]
@@ -94,7 +110,7 @@ func (hand *findSidHandler) ServeHTTP(w http.ResponseWriter, req *http.Request)
 	}
 	span := hand.store.FindSpan(sid)
 	if span == nil {
-		w.WriteHeader(http.StatusNoContent)
+		writeError(w, http.StatusNoContent, "No spans were specified.")
 		return
 	}
 	w.Write(span.ToJson())
@@ -105,6 +121,7 @@ type findChildrenHandler struct {
 }
 
 func (hand *findChildrenHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	setResponseHeaders(w.Header())
 	req.ParseForm()
 	vars := mux.Vars(req)
 	stringSid := vars["id"]
@@ -118,10 +135,6 @@ func (hand *findChildrenHandler) ServeHTTP(w http.ResponseWriter, req *http.Requ
 		return
 	}
 	children := hand.store.FindChildren(sid, lim)
-	if len(children) == 0 {
-		w.WriteHeader(http.StatusNoContent)
-		return
-	}
 	jbytes, err := json.Marshal(children)
 	if err != nil {
 		panic(err)
@@ -134,6 +147,7 @@ type writeSpansHandler struct {
 }
 
 func (hand *writeSpansHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	setResponseHeaders(w.Header())
 	dec := json.NewDecoder(req.Body)
 	spans := make([]*common.Span, 0, 32)
 	for {
@@ -141,9 +155,7 @@ func (hand *writeSpansHandler) ServeHTTP(w http.ResponseWriter, req *http.Reques
 		err := dec.Decode(&span)
 		if err != nil {
 			if err != io.EOF {
-				w.WriteHeader(http.StatusBadRequest)
-				log.Printf("Error parsing spans: %s\n", err.Error())
-				w.Write([]byte("Error parsing spans : " + err.Error()))
+				writeError(w, http.StatusBadRequest, "Error parsing spans: %s", err.Error())
 				return
 			}
 			break