From c41f695e74c389d541cadee26a44e7bbc5e95c56 Mon Sep 17 00:00:00 2001 From: Michael Baird Date: Thu, 18 May 2017 16:36:22 -0500 Subject: [PATCH] more metrics tests --- datadog/datadog_test.go | 18 +++++++++++ handler_test.go | 72 +++++++++++++++++++++++++++++++++++++++++ index.go | 4 +-- server.go | 2 +- 4 files changed, 93 insertions(+), 3 deletions(-) diff --git a/datadog/datadog_test.go b/datadog/datadog_test.go index f1743bee7..d86f06719 100644 --- a/datadog/datadog_test.go +++ b/datadog/datadog_test.go @@ -18,6 +18,7 @@ import ( "io/ioutil" "reflect" "testing" + "time" "github.com/pilosa/pilosa/datadog" ) @@ -43,3 +44,20 @@ func TestStatsClient_WithTags(t *testing.T) { t.Fatalf("unexpected tags: %+v", tags) } } + +func TestStatsClient_Methods(t *testing.T) { + // Create a new client. + c, err := datadog.NewStatsClient("localhost:19444") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dur, _ := time.ParseDuration("123us") + c.CountWithCustomTags("ct", 1, 1.0, []string{"foo:bar"}) + c.Count("cc", 1, 1.0) + c.Gauge("gg", 10, 1.0) + c.Histogram("hh", 1, 1.0) + c.Timing("tt", dur, 1.0) + c.Set("ss", "ss", 1.0) +} diff --git a/handler_test.go b/handler_test.go index 740b03390..b46821d93 100644 --- a/handler_test.go +++ b/handler_test.go @@ -86,6 +86,47 @@ func TestHandler_Schema(t *testing.T) { } } +// Ensure the handler can return the status. +func TestHandler_Status(t *testing.T) { + s := NewServer() + hldr := MustOpenHolder() + defer s.Close() + defer hldr.Close() + + i0 := hldr.MustCreateIndexIfNotExists("i0", pilosa.IndexOptions{}) + i1 := hldr.MustCreateIndexIfNotExists("i1", pilosa.IndexOptions{}) + + if f, err := i0.CreateFrameIfNotExists("f1", pilosa.FrameOptions{InverseEnabled: true}); err != nil { + t.Fatal(err) + } else if _, err := f.SetBit(pilosa.ViewStandard, 0, 0, nil); err != nil { + t.Fatal(err) + } else if _, err := f.SetBit(pilosa.ViewInverse, 0, 0, nil); err != nil { + t.Fatal(err) + } + if f, err := i1.CreateFrameIfNotExists("f0", pilosa.FrameOptions{}); err != nil { + t.Fatal(err) + } else if _, err := f.SetBit(pilosa.ViewStandard, 0, 0, nil); err != nil { + t.Fatal(err) + } + if _, err := i0.CreateFrameIfNotExists("f0", pilosa.FrameOptions{}); err != nil { + t.Fatal(err) + } + + h := NewHandler() + h.Holder = hldr.Holder + h.Cluster = NewCluster(1) + h.StatusHandler = s + s.Handler = h + + w := httptest.NewRecorder() + h.ServeHTTP(w, MustNewHTTPRequest("GET", "/status", nil)) + if w.Code != http.StatusOK { + t.Fatalf("unexpected status code: %d", w.Code) + } else if body := w.Body.String(); body != `{"status":{"State":"UP","Indexes":[{"Name":"i0","Meta":{"ColumnLabel":"columnID"},"Frames":[{"Name":"f0","Meta":{"RowLabel":"rowID","CacheType":"ranked","CacheSize":50000}},{"Name":"f1","Meta":{"RowLabel":"rowID","InverseEnabled":true,"CacheType":"ranked","CacheSize":50000}}]},{"Name":"i1","Meta":{"ColumnLabel":"columnID"},"Frames":[{"Name":"f0","Meta":{"RowLabel":"rowID","CacheType":"ranked","CacheSize":50000}}]}]}}`+"\n" { + t.Fatalf("unexpected body: %s", body) + } +} + // Ensure the handler can return the maxslice map. func TestHandler_MaxSlices(t *testing.T) { hldr := MustOpenHolder() @@ -946,6 +987,37 @@ func NewServer() *Server { return s } +// LocalStatus returns the state of the local node as well as the +// holder (indexes/frames) according to the local node. +func (s *Server) LocalStatus() (proto.Message, error) { + if s.Handler.Holder == nil { + return nil, errors.New("Server.Holder is nil") + } + + ns := internal.NodeStatus{ + Host: s.Handler.Handler.Host, + State: pilosa.NodeStateUp, + Indexes: pilosa.EncodeIndexes(s.Handler.Holder.Indexes()), + } + + // Append Slice list per this Node's indexes + for _, index := range ns.Indexes { + index.Slices = s.Handler.Cluster.OwnsSlices(index.Name, index.MaxSlice, s.Handler.Host) + } + + return &ns, nil +} + +// ClusterStatus returns the NodeState for all nodes in the cluster. +func (s *Server) ClusterStatus() (proto.Message, error) { + // Assuming we are only testing this with one Node + // So just return its status + return s.LocalStatus() +} + +// HandleRemoteStatus just need to implement a nop to complete the Interface +func (s *Server) HandleRemoteStatus(pb proto.Message) error { return nil } + // Host returns the hostname of the running server. func (s *Server) Host() string { return MustParseURLHost(s.URL) } diff --git a/index.go b/index.go index 766af6036..8a1b34aed 100644 --- a/index.go +++ b/index.go @@ -530,8 +530,8 @@ func MergeSchemas(a, b []*IndexInfo) []*IndexInfo { return idxs } -// encodeIndexes converts a into its internal representation. -func encodeIndexes(a []*Index) []*internal.Index { +// EncodeIndexes converts a into its internal representation. +func EncodeIndexes(a []*Index) []*internal.Index { other := make([]*internal.Index, len(a)) for i := range a { other[i] = encodeIndex(a[i]) diff --git a/server.go b/server.go index d1030c021..428e979c4 100644 --- a/server.go +++ b/server.go @@ -333,7 +333,7 @@ func (s *Server) LocalStatus() (proto.Message, error) { ns := internal.NodeStatus{ Host: s.Host, State: NodeStateUp, - Indexes: encodeIndexes(s.Holder.Indexes()), + Indexes: EncodeIndexes(s.Holder.Indexes()), } // Append Slice list per this Node's indexes