mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-14 02:35:56 +08:00
Merge pull request #962 from SigNoz/ttl-plus
Add remove TTL api, and do not allow zero or negative TTL
This commit is contained in:
commit
42269a7c78
@ -2333,6 +2333,40 @@ func (r *ClickHouseReader) setColdStorage(ctx context.Context, tableName string,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *ClickHouseReader) RemoveTTL(ctx context.Context,
|
||||||
|
params *model.RemoveTTLParams) (*model.RemoveTTLResponseItem, *model.ApiError) {
|
||||||
|
|
||||||
|
var reqs []string
|
||||||
|
templateQuery := `ALTER TABLE %v REMOVE TTL`
|
||||||
|
tracesTables := []string{signozTraceDBName + "." + signozTraceTableName, signozTraceDBName + "." + signozDurationMVTable, signozTraceDBName + "." + signozSpansTable, signozTraceDBName + "." + signozErrorIndexTable}
|
||||||
|
metricsTables := []string{signozMetricDBName + "." + signozSampleName}
|
||||||
|
|
||||||
|
switch params.Type {
|
||||||
|
case constants.TraceTTL:
|
||||||
|
for _, tableName := range tracesTables {
|
||||||
|
reqs = append(reqs, fmt.Sprintf(templateQuery, tableName))
|
||||||
|
}
|
||||||
|
case constants.MetricsTTL:
|
||||||
|
for _, tableName := range metricsTables {
|
||||||
|
reqs = append(reqs, fmt.Sprintf(templateQuery, tableName))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
for _, tableName := range append(append([]string{}, tracesTables...), metricsTables...) {
|
||||||
|
reqs = append(reqs, fmt.Sprintf(templateQuery, tableName))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zap.S().Debugf("Executing remove TTL requests: %s\n", reqs)
|
||||||
|
for _, req := range reqs {
|
||||||
|
if err := r.db.Exec(ctx, req); err != nil {
|
||||||
|
zap.S().Error(fmt.Errorf("error while removing ttl. Err=%v", err))
|
||||||
|
return nil, &model.ApiError{Typ: model.ErrorExec,
|
||||||
|
Err: fmt.Errorf("error while removing ttl. Err=%v", err)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &model.RemoveTTLResponseItem{Message: "ttl has been successfully removed"}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetDisks returns a list of disks {name, type} configured in clickhouse DB.
|
// GetDisks returns a list of disks {name, type} configured in clickhouse DB.
|
||||||
func (r *ClickHouseReader) GetDisks(ctx context.Context) (*[]model.DiskItem, *model.ApiError) {
|
func (r *ClickHouseReader) GetDisks(ctx context.Context) (*[]model.DiskItem, *model.ApiError) {
|
||||||
diskItems := []model.DiskItem{}
|
diskItems := []model.DiskItem{}
|
||||||
|
@ -310,6 +310,7 @@ func (aH *APIHandler) RegisterRoutes(router *mux.Router) {
|
|||||||
router.HandleFunc("/api/v1/serviceMapDependencies", ViewAccess(aH.serviceMapDependencies)).Methods(http.MethodPost)
|
router.HandleFunc("/api/v1/serviceMapDependencies", ViewAccess(aH.serviceMapDependencies)).Methods(http.MethodPost)
|
||||||
router.HandleFunc("/api/v1/settings/ttl", AdminAccess(aH.setTTL)).Methods(http.MethodPost)
|
router.HandleFunc("/api/v1/settings/ttl", AdminAccess(aH.setTTL)).Methods(http.MethodPost)
|
||||||
router.HandleFunc("/api/v1/settings/ttl", ViewAccess(aH.getTTL)).Methods(http.MethodGet)
|
router.HandleFunc("/api/v1/settings/ttl", ViewAccess(aH.getTTL)).Methods(http.MethodGet)
|
||||||
|
router.HandleFunc("/api/v1/settings/ttl", AdminAccess(aH.removeTTL)).Methods(http.MethodDelete)
|
||||||
|
|
||||||
router.HandleFunc("/api/v1/version", OpenAccess(aH.getVersion)).Methods(http.MethodGet)
|
router.HandleFunc("/api/v1/version", OpenAccess(aH.getVersion)).Methods(http.MethodGet)
|
||||||
|
|
||||||
@ -1162,6 +1163,47 @@ func (aH *APIHandler) getTTL(w http.ResponseWriter, r *http.Request) {
|
|||||||
aH.writeJSON(w, r, result)
|
aH.writeJSON(w, r, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (aH *APIHandler) removeTTL(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ttlParams, err := parseRemoveTTL(r)
|
||||||
|
if aH.handleError(w, err, http.StatusBadRequest) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
existingTTL, apiErr := (*aH.reader).GetTTL(context.Background(), &model.GetTTLParams{GetAllTTL: true})
|
||||||
|
if apiErr != nil && aH.handleError(w, apiErr.Err, http.StatusInternalServerError) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ttlParams.Type == constants.TraceTTL && existingTTL.TracesTime == -1 &&
|
||||||
|
aH.handleError(w, fmt.Errorf("traces doesn't have any TTL set, cannot remove"), http.StatusBadRequest) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ttlParams.Type == constants.MetricsTTL && existingTTL.MetricsTime == -1 &&
|
||||||
|
aH.handleError(w, fmt.Errorf("metrics doesn't have any TTL set, cannot remove"), http.StatusBadRequest) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ttlParams.RemoveAllTTL {
|
||||||
|
if existingTTL.TracesTime == -1 && existingTTL.MetricsTime != -1 {
|
||||||
|
ttlParams.Type = constants.MetricsTTL
|
||||||
|
ttlParams.RemoveAllTTL = false
|
||||||
|
} else if existingTTL.TracesTime != -1 && existingTTL.MetricsTime == -1 {
|
||||||
|
ttlParams.Type = constants.TraceTTL
|
||||||
|
ttlParams.RemoveAllTTL = false
|
||||||
|
} else if aH.handleError(w, fmt.Errorf("no TTL set, cannot remove"), http.StatusBadRequest) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result, apiErr := (*aH.reader).RemoveTTL(context.Background(), ttlParams)
|
||||||
|
if apiErr != nil && aH.handleError(w, apiErr.Err, http.StatusInternalServerError) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
aH.writeJSON(w, r, result)
|
||||||
|
}
|
||||||
|
|
||||||
func (aH *APIHandler) getDisks(w http.ResponseWriter, r *http.Request) {
|
func (aH *APIHandler) getDisks(w http.ResponseWriter, r *http.Request) {
|
||||||
result, apiErr := (*aH.reader).GetDisks(context.Background())
|
result, apiErr := (*aH.reader).GetDisks(context.Background())
|
||||||
if apiErr != nil && aH.handleError(w, apiErr.Err, http.StatusInternalServerError) {
|
if apiErr != nil && aH.handleError(w, apiErr.Err, http.StatusInternalServerError) {
|
||||||
|
@ -50,6 +50,7 @@ type Reader interface {
|
|||||||
|
|
||||||
// Setter Interfaces
|
// Setter Interfaces
|
||||||
SetTTL(ctx context.Context, ttlParams *model.TTLParams) (*model.SetTTLResponseItem, *model.ApiError)
|
SetTTL(ctx context.Context, ttlParams *model.TTLParams) (*model.SetTTLResponseItem, *model.ApiError)
|
||||||
|
RemoveTTL(ctx context.Context, ttlParams *model.RemoveTTLParams) (*model.RemoveTTLResponseItem, *model.ApiError)
|
||||||
|
|
||||||
GetMetricAutocompleteMetricNames(ctx context.Context, matchText string) (*[]string, *model.ApiError)
|
GetMetricAutocompleteMetricNames(ctx context.Context, matchText string) (*[]string, *model.ApiError)
|
||||||
GetMetricAutocompleteTagKey(ctx context.Context, params *model.MetricAutocompleteTagParams) (*[]string, *model.ApiError)
|
GetMetricAutocompleteTagKey(ctx context.Context, params *model.MetricAutocompleteTagParams) (*[]string, *model.ApiError)
|
||||||
|
@ -545,7 +545,7 @@ func parseTTLParams(r *http.Request) (*model.TTLParams, error) {
|
|||||||
|
|
||||||
// Validate the TTL duration.
|
// Validate the TTL duration.
|
||||||
durationParsed, err := time.ParseDuration(delDuration)
|
durationParsed, err := time.ParseDuration(delDuration)
|
||||||
if err != nil {
|
if err != nil || durationParsed.Seconds() <= 0 {
|
||||||
return nil, fmt.Errorf("Not a valid TTL duration %v", delDuration)
|
return nil, fmt.Errorf("Not a valid TTL duration %v", delDuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -554,7 +554,7 @@ func parseTTLParams(r *http.Request) (*model.TTLParams, error) {
|
|||||||
// If some cold storage is provided, validate the cold storage move TTL.
|
// If some cold storage is provided, validate the cold storage move TTL.
|
||||||
if len(coldStorage) > 0 {
|
if len(coldStorage) > 0 {
|
||||||
toColdParsed, err = time.ParseDuration(toColdDuration)
|
toColdParsed, err = time.ParseDuration(toColdDuration)
|
||||||
if err != nil {
|
if err != nil || toColdParsed.Seconds() <= 0 {
|
||||||
return nil, fmt.Errorf("Not a valid toCold TTL duration %v", toColdDuration)
|
return nil, fmt.Errorf("Not a valid toCold TTL duration %v", toColdDuration)
|
||||||
}
|
}
|
||||||
if toColdParsed.Seconds() != 0 && toColdParsed.Seconds() >= durationParsed.Seconds() {
|
if toColdParsed.Seconds() != 0 && toColdParsed.Seconds() >= durationParsed.Seconds() {
|
||||||
@ -587,6 +587,23 @@ func parseGetTTL(r *http.Request) (*model.GetTTLParams, error) {
|
|||||||
return &model.GetTTLParams{Type: typeTTL, GetAllTTL: getAllTTL}, nil
|
return &model.GetTTLParams{Type: typeTTL, GetAllTTL: getAllTTL}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseRemoveTTL(r *http.Request) (*model.RemoveTTLParams, error) {
|
||||||
|
|
||||||
|
typeTTL := r.URL.Query().Get("type")
|
||||||
|
removeAllTTL := false
|
||||||
|
|
||||||
|
if len(typeTTL) == 0 {
|
||||||
|
removeAllTTL = true
|
||||||
|
} else {
|
||||||
|
// Validate the type parameter
|
||||||
|
if typeTTL != constants.TraceTTL && typeTTL != constants.MetricsTTL {
|
||||||
|
return nil, fmt.Errorf("type param should be <metrics|traces>, got %v", typeTTL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &model.RemoveTTLParams{Type: typeTTL, RemoveAllTTL: removeAllTTL}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func parseUserRequest(r *http.Request) (*model.User, error) {
|
func parseUserRequest(r *http.Request) (*model.User, error) {
|
||||||
var req model.User
|
var req model.User
|
||||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
@ -206,3 +206,8 @@ type GetErrorParams struct {
|
|||||||
ErrorID string
|
ErrorID string
|
||||||
ServiceName string
|
ServiceName string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RemoveTTLParams struct {
|
||||||
|
Type string
|
||||||
|
RemoveAllTTL bool
|
||||||
|
}
|
||||||
|
@ -246,6 +246,10 @@ type SetTTLResponseItem struct {
|
|||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RemoveTTLResponseItem struct {
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
type DiskItem struct {
|
type DiskItem struct {
|
||||||
Name string `json:"name,omitempty" ch:"name"`
|
Name string `json:"name,omitempty" ch:"name"`
|
||||||
Type string `json:"type,omitempty" ch:"type"`
|
Type string `json:"type,omitempty" ch:"type"`
|
||||||
|
Loading…
x
Reference in New Issue
Block a user