Repository: incubator-htrace
Updated Branches:
  refs/heads/master 157c20ae6 -> 695fefd9f


HTRACE-277: htraced: Add /server/conf endpoint to get server configuration 
(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/695fefd9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/695fefd9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/695fefd9

Branch: refs/heads/master
Commit: 695fefd9f7c3621aa91b04bfadb281b970f20390
Parents: 157c20a
Author: Colin P. Mccabe <[email protected]>
Authored: Wed Oct 21 11:48:36 2015 -0700
Committer: Colin P. Mccabe <[email protected]>
Committed: Wed Oct 21 11:48:36 2015 -0700

----------------------------------------------------------------------
 .../go/src/org/apache/htrace/client/client.go   | 15 ++++++++++
 .../go/src/org/apache/htrace/conf/config.go     | 12 ++++++++
 .../go/src/org/apache/htrace/htrace/cmd.go      | 19 +++++++++++++
 .../org/apache/htrace/htraced/client_test.go    | 29 ++++++++++++++++++++
 .../go/src/org/apache/htrace/htraced/rest.go    | 22 +++++++++++++++
 5 files changed, 97 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/695fefd9/htrace-htraced/go/src/org/apache/htrace/client/client.go
----------------------------------------------------------------------
diff --git a/htrace-htraced/go/src/org/apache/htrace/client/client.go 
b/htrace-htraced/go/src/org/apache/htrace/client/client.go
index dd3f8a3..dd8597d 100644
--- a/htrace-htraced/go/src/org/apache/htrace/client/client.go
+++ b/htrace-htraced/go/src/org/apache/htrace/client/client.go
@@ -82,6 +82,21 @@ func (hcl *Client) GetServerStats() (*common.ServerStats, 
error) {
        return &stats, nil
 }
 
+// Get the htraced server statistics.
+func (hcl *Client) GetServerConf() (map[string]string, error) {
+       buf, _, err := hcl.makeGetRequest("server/conf")
+       if err != nil {
+               return nil, err
+       }
+       cnf := make(map[string]string)
+       err = json.Unmarshal(buf, &cnf)
+       if err != nil {
+               return nil, errors.New(fmt.Sprintf("Error: error unmarshalling 
response "+
+                       "body %s: %s", string(buf), err.Error()))
+       }
+       return cnf, nil
+}
+
 // Get information about a trace span.  Returns nil, nil if the span was not 
found.
 func (hcl *Client) FindSpan(sid common.SpanId) (*common.Span, error) {
        buf, rc, err := hcl.makeGetRequest(fmt.Sprintf("span/%s", sid.String()))

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/695fefd9/htrace-htraced/go/src/org/apache/htrace/conf/config.go
----------------------------------------------------------------------
diff --git a/htrace-htraced/go/src/org/apache/htrace/conf/config.go 
b/htrace-htraced/go/src/org/apache/htrace/conf/config.go
index 76af7a6..d038723 100644
--- a/htrace-htraced/go/src/org/apache/htrace/conf/config.go
+++ b/htrace-htraced/go/src/org/apache/htrace/conf/config.go
@@ -266,3 +266,15 @@ func (cnf *Config) Clone(args ...string) *Config {
        }
        return ncnf
 }
+
+// Export the configuration as a map
+func (cnf *Config) Export() map[string]string {
+       m := make(map[string]string)
+       for k, v := range cnf.defaults {
+               m[k] = v
+       }
+       for k, v := range cnf.settings {
+               m[k] = v
+       }
+       return m
+}

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/695fefd9/htrace-htraced/go/src/org/apache/htrace/htrace/cmd.go
----------------------------------------------------------------------
diff --git a/htrace-htraced/go/src/org/apache/htrace/htrace/cmd.go 
b/htrace-htraced/go/src/org/apache/htrace/htrace/cmd.go
index b5549c5..f6972bb 100644
--- a/htrace-htraced/go/src/org/apache/htrace/htrace/cmd.go
+++ b/htrace-htraced/go/src/org/apache/htrace/htrace/cmd.go
@@ -65,6 +65,7 @@ func main() {
        serverInfo := app.Command("serverInfo", "Print information retrieved 
from an htraced server.")
        serverStats := app.Command("serverStats", "Print statistics retrieved 
from the htraced server.")
        serverStatsJson := serverStats.Flag("json", "Display statistics as raw 
JSON.").Default("false").Bool()
+       serverConf := app.Command("serverConf", "Print the server configuration 
retrieved from the htraced server.")
        findSpan := app.Command("findSpan", "Print information about a trace 
span with a given ID.")
        findSpanId := findSpan.Arg("id", "Span ID to find. Example: 
be305e54-4534-2110-a0b2-e06b9effe112").Required().String()
        findChildren := app.Command("findChildren", "Print out the span IDs 
that are children of a given span ID.")
@@ -131,6 +132,8 @@ func main() {
                } else {
                        os.Exit(printServerStats(hcl))
                }
+       case serverConf.FullCommand():
+               os.Exit(printServerConfJson(hcl))
        case findSpan.FullCommand():
                var id *common.SpanId
                id.FromString(*findSpanId)
@@ -221,6 +224,22 @@ func printServerStatsJson(hcl *htrace.Client) int {
        return EXIT_SUCCESS
 }
 
+// Print information retrieved from an htraced server via /server/conf as JSON
+func printServerConfJson(hcl *htrace.Client) int {
+       cnf, err := hcl.GetServerConf()
+       if err != nil {
+               fmt.Println(err.Error())
+               return EXIT_FAILURE
+       }
+       buf, err := json.MarshalIndent(cnf, "", "  ")
+       if err != nil {
+               fmt.Printf("Error marshalling server conf: %s", err.Error())
+               return EXIT_FAILURE
+       }
+       fmt.Printf("%s\n", string(buf))
+       return EXIT_SUCCESS
+}
+
 // Print information about a trace span.
 func doFindSpan(hcl *htrace.Client, sid common.SpanId) int {
        span, err := hcl.FindSpan(sid)

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/695fefd9/htrace-htraced/go/src/org/apache/htrace/htraced/client_test.go
----------------------------------------------------------------------
diff --git a/htrace-htraced/go/src/org/apache/htrace/htraced/client_test.go 
b/htrace-htraced/go/src/org/apache/htrace/htraced/client_test.go
index 02a00f3..540e688 100644
--- a/htrace-htraced/go/src/org/apache/htrace/htraced/client_test.go
+++ b/htrace-htraced/go/src/org/apache/htrace/htraced/client_test.go
@@ -204,3 +204,32 @@ func TestDumpAll(t *testing.T) {
                t.Fatalf("got dump error %s\n", dumpErr.Error())
        }
 }
+
+const EXAMPLE_CONF_KEY = "example.conf.key"
+const EXAMPLE_CONF_VALUE = "foo.bar.baz"
+
+func TestClientGetServerConf(t *testing.T) {
+       htraceBld := &MiniHTracedBuilder{Name: "TestClientGetServerConf",
+               Cnf: map[string]string {
+                       EXAMPLE_CONF_KEY: EXAMPLE_CONF_VALUE,
+               },
+               DataDirs: make([]string, 2)}
+       ht, err := htraceBld.Build()
+       if err != nil {
+               t.Fatalf("failed to create datastore: %s", err.Error())
+       }
+       defer ht.Close()
+       var hcl *htrace.Client
+       hcl, err = htrace.NewClient(ht.ClientConf())
+       if err != nil {
+               t.Fatalf("failed to create client: %s", err.Error())
+       }
+       serverCnf, err2 := hcl.GetServerConf()
+       if err2 != nil {
+               t.Fatalf("failed to call GetServerConf: %s", err2.Error())
+       }
+       if serverCnf[EXAMPLE_CONF_KEY] != EXAMPLE_CONF_VALUE {
+               t.Fatalf("unexpected value for %s: %s",
+                               EXAMPLE_CONF_KEY, EXAMPLE_CONF_VALUE)
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/695fefd9/htrace-htraced/go/src/org/apache/htrace/htraced/rest.go
----------------------------------------------------------------------
diff --git a/htrace-htraced/go/src/org/apache/htrace/htraced/rest.go 
b/htrace-htraced/go/src/org/apache/htrace/htraced/rest.go
index c038e59..16c3a75 100644
--- a/htrace-htraced/go/src/org/apache/htrace/htraced/rest.go
+++ b/htrace-htraced/go/src/org/apache/htrace/htraced/rest.go
@@ -88,6 +88,25 @@ func (hand *serverStatsHandler) ServeHTTP(w 
http.ResponseWriter, req *http.Reque
        w.Write(buf)
 }
 
+type serverConfHandler struct {
+       cnf *conf.Config
+       lg *common.Logger
+}
+
+func (hand *serverConfHandler) ServeHTTP(w http.ResponseWriter, req 
*http.Request) {
+       setResponseHeaders(w.Header())
+       hand.lg.Debugf("serverConfHandler\n")
+       cnfMap := hand.cnf.Export()
+       buf, err := json.Marshal(&cnfMap)
+       if err != nil {
+               writeError(hand.lg, w, http.StatusInternalServerError,
+                       fmt.Sprintf("error marshalling serverConf: %s\n", 
err.Error()))
+               return
+       }
+       hand.lg.Debugf("Returned server configuration %s\n", string(buf))
+       w.Write(buf)
+}
+
 type dataStoreHandler struct {
        lg    *common.Logger
        store *dataStore
@@ -295,6 +314,9 @@ func CreateRestServer(cnf *conf.Config, store *dataStore) 
(*RestServer, error) {
                store: store, lg: rsv.lg}}
        r.Handle("/server/stats", serverStatsH).Methods("GET")
 
+       serverConfH := &serverConfHandler{cnf: cnf, lg: rsv.lg}
+       r.Handle("/server/conf", serverConfH).Methods("GET")
+
        writeSpansH := &writeSpansHandler{dataStoreHandler: dataStoreHandler{
                store: store, lg: rsv.lg}}
        r.Handle("/writeSpans", writeSpansH).Methods("POST")

Reply via email to