From ec25ca661968ceed45f9f1672b05b91c5b5fc2b7 Mon Sep 17 00:00:00 2001 From: Sridhar Seshasayee Date: Mon, 14 Jan 2019 01:37:35 +0530 Subject: [PATCH] Tracing: Implement glustercli command to disable the trace configuration Implement glustercli command to disable and delete the current tracing configuration on the cluster. The changes include gd2 transaction that first deletes the trace configuration from the store on one node and then a subsequent step clears the in-memory trace configuration on all nodes. closes #1368 Signed-off-by: Sridhar Seshasayee --- e2e/trace_test.go | 38 +++++++++++++++++++++++++ glustercli/cmd/tracing.go | 14 +++++++++ pkg/restclient/tracing.go | 6 ++++ plugins/tracemgmt/init.go | 7 +++++ plugins/tracemgmt/rest.go | 47 +++++++++++++++++++++++++++++++ plugins/tracemgmt/transactions.go | 26 +++++++++++++++++ 6 files changed, 138 insertions(+) diff --git a/e2e/trace_test.go b/e2e/trace_test.go index 40e2d466..e0993cf5 100644 --- a/e2e/trace_test.go +++ b/e2e/trace_test.go @@ -282,3 +282,41 @@ func TestTraceUpdateInvalidOption(t *testing.T) { r.Equal(0, jaegerCfgInfo.JaegerSampler) r.Equal(0.0, jaegerCfgInfo.JaegerSampleFraction) } + +func TestTraceDisable(t *testing.T) { + r := require.New(t) + + tc, err := setupCluster(t, "./config/1.toml", "./config/2.toml") + r.Nil(err) + defer teardownCluster(tc) + + client, err := initRestclient(tc.gds[0]) + r.Nil(err) + r.NotNil(client) + + jaegerSampler := 1 + reqTraceEnable := tracemgmtapi.SetupTracingReq{ + JaegerEndpoint: jaegerEndpoint, + JaegerAgentEndpoint: jaegerAgentEndpoint, + JaegerSampler: jaegerSampler, + } + jaegerCfgInfo, err := client.TraceEnable(reqTraceEnable) + r.Nil(err) + + r.Equal(jaegerEndpoint, jaegerCfgInfo.JaegerEndpoint) + r.Equal(jaegerAgentEndpoint, jaegerCfgInfo.JaegerAgentEndpoint) + r.Equal(jaegerSampler, jaegerCfgInfo.JaegerSampler) + r.Equal(1.0, jaegerCfgInfo.JaegerSampleFraction) + + // Delete the trace config + err = client.TraceDisable() + r.Nil(err) + + // Get the trace config + jaegerCfgInfo, err = client.TraceStatus() + r.Nil(err) + r.Equal("", jaegerCfgInfo.JaegerEndpoint) + r.Equal("", jaegerCfgInfo.JaegerAgentEndpoint) + r.Equal(0, jaegerCfgInfo.JaegerSampler) + r.Equal(0.0, jaegerCfgInfo.JaegerSampleFraction) +} diff --git a/glustercli/cmd/tracing.go b/glustercli/cmd/tracing.go index 9fde1e4c..96946e76 100644 --- a/glustercli/cmd/tracing.go +++ b/glustercli/cmd/tracing.go @@ -18,6 +18,7 @@ const ( helpTraceEnableCmd = "Enable Tracing" helpTraceStatusCmd = "Show Tracing Status" helpTraceUpdateCmd = "Update Tracing Options" + helpTraceDisableCmd = "Disable Tracing" errTraceEnableReqFailed = "Failed to enable tracing" errTraceUpdateReqFailed = "Failed to update trace configuration" ) @@ -41,6 +42,7 @@ func init() { traceCmd.AddCommand(traceEnableCmd) traceCmd.AddCommand(traceStatusCmd) traceCmd.AddCommand(traceUpdateCmd) + traceCmd.AddCommand(traceDisableCmd) } func validateJaegerSampler() { @@ -151,3 +153,15 @@ var traceUpdateCmd = &cobra.Command{ fmt.Println("Trace update successful") }, } + +var traceDisableCmd = &cobra.Command{ + Use: "disable", + Short: helpTraceDisableCmd, + Run: func(cmd *cobra.Command, args []string) { + err := client.TraceDisable() + if err != nil { + failure("Trace disable failed", err, 1) + } + fmt.Println("Trace disable successful") + }, +} diff --git a/pkg/restclient/tracing.go b/pkg/restclient/tracing.go index f45a2f6e..1a11e3e4 100644 --- a/pkg/restclient/tracing.go +++ b/pkg/restclient/tracing.go @@ -26,3 +26,9 @@ func (c *Client) TraceUpdate(req tracemgmtapi.SetupTracingReq) (tracemgmtapi.Jae err := c.post("/v1/tracemgmt/update", req, http.StatusOK, &jaegercfginfo) return jaegercfginfo, err } + +// TraceDisable disables and optionally deletes the tracing config +func (c *Client) TraceDisable() error { + err := c.del("/v1/tracemgmt", nil, http.StatusNoContent, nil) + return err +} diff --git a/plugins/tracemgmt/init.go b/plugins/tracemgmt/init.go index 4cee5485..98617bce 100644 --- a/plugins/tracemgmt/init.go +++ b/plugins/tracemgmt/init.go @@ -42,6 +42,12 @@ func (p *Plugin) RestRoutes() route.Routes { RequestType: utils.GetTypeString((*tracemgmtapi.SetupTracingReq)(nil)), ResponseType: utils.GetTypeString((*tracemgmtapi.JaegerConfigInfo)(nil)), HandlerFunc: tracingUpdateHandler}, + route.Route{ + Name: "TraceDisable", + Method: "DELETE", + Pattern: "/tracemgmt", + Version: 1, + HandlerFunc: tracingDisableHandler}, } } @@ -52,4 +58,5 @@ func (p *Plugin) RegisterStepFuncs() { transaction.RegisterStepFunc(txnTracingUndoStoreConfig, "trace-mgmt.RestoreTraceConfig") transaction.RegisterStepFunc(txnTracingDeleteStoreConfig, "trace-mgmt.UndoStoreTraceConfig") transaction.RegisterStepFunc(txnTracingApplyNewConfig, "trace-mgmt.NotifyTraceConfigChange") + transaction.RegisterStepFunc(txnTracingDisable, "trace-mgmt.NotifyTraceDisable") } diff --git a/plugins/tracemgmt/rest.go b/plugins/tracemgmt/rest.go index bf1a5666..67e99476 100644 --- a/plugins/tracemgmt/rest.go +++ b/plugins/tracemgmt/rest.go @@ -194,3 +194,50 @@ func tracingUpdateHandler(w http.ResponseWriter, r *http.Request) { restutils.SendHTTPResponse(ctx, w, http.StatusOK, traceConfig) } + +func tracingDisableHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + logger := gdctx.GetReqLogger(ctx) + + // Get the current trace config from the store + _, err := traceutils.GetTraceConfig() + if err != nil { + restutils.SendHTTPError(ctx, w, http.StatusNotFound, "No trace configuration exists") + return + } + + txn, err := transactionv2.NewTxnWithLocks(ctx, gdctx.MyClusterID.String()) + if err != nil { + status, err := restutils.ErrToStatusCode(err) + restutils.SendHTTPError(ctx, w, status, err) + return + } + defer txn.Done() + + nodes, err := peer.GetPeerIDs() + if err != nil { + restutils.SendHTTPError(ctx, w, http.StatusInternalServerError, err) + return + } + + txn.Steps = []*transaction.Step{ + { + DoFunc: "trace-mgmt.UndoStoreTraceConfig", + Nodes: []uuid.UUID{gdctx.MyUUID}, + Sync: true, + }, + { + DoFunc: "trace-mgmt.NotifyTraceDisable", + Nodes: nodes, + Sync: true, + }, + } + + if err = txn.Do(); err != nil { + logger.WithError(err).Error("Failed to disable trace configuration") + restutils.SendHTTPError(ctx, w, http.StatusInternalServerError, err) + return + } + + restutils.SendHTTPResponse(ctx, w, http.StatusNoContent, nil) +} diff --git a/plugins/tracemgmt/transactions.go b/plugins/tracemgmt/transactions.go index 7ec60468..5923d696 100644 --- a/plugins/tracemgmt/transactions.go +++ b/plugins/tracemgmt/transactions.go @@ -1,6 +1,8 @@ package tracemgmt import ( + "errors" + "github.com/gluster/glusterd2/glusterd2/gdctx" "github.com/gluster/glusterd2/glusterd2/transaction" "github.com/gluster/glusterd2/pkg/tracing" @@ -134,3 +136,27 @@ func txnTracingApplyNewConfig(c transaction.TxnCtx) error { return nil } + +// Transaction step that disables tracing and resets the tracing config. +func txnTracingDisable(c transaction.TxnCtx) error { + // Disable tracing + trace.ApplyConfig(trace.Config{DefaultSampler: trace.NeverSample()}) + + // Unregister the old Jaeger exporter if it exists + Exporter := tracing.JaegerExporter() + if Exporter == nil { + return errors.New("no opencensus exporter registered") + } + trace.UnregisterExporter(Exporter) + + // Reset the global Jaeger trace config + traceCfg := tracing.JaegerTraceConfig{ + JaegerEndpoint: "", + JaegerAgentEndpoint: "", + JaegerSampler: 0, + JaegerSampleFraction: 0.0, + } + tracing.SetJaegerTraceConfig(traceCfg) + + return nil +}