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 +}