package metrics import ( "fmt" "reflect" "strings" "go.uber.org/zap" ) // FormattedValue formats the value to be used in clickhouse query func FormattedValue(v interface{}) string { switch x := v.(type) { case int: return fmt.Sprintf("%d", x) case float32, float64: return fmt.Sprintf("%f", x) case string: return fmt.Sprintf("'%s'", x) case bool: return fmt.Sprintf("%v", x) case []interface{}: if len(x) == 0 { return "" } switch x[0].(type) { case string: str := "[" for idx, sVal := range x { str += fmt.Sprintf("'%s'", sVal) if idx != len(x)-1 { str += "," } } str += "]" return str case int, float32, float64, bool: return strings.Join(strings.Fields(fmt.Sprint(x)), ",") default: zap.L().Error("invalid type for formatted value", zap.Any("type", reflect.TypeOf(x[0]))) return "" } default: zap.L().Error("invalid type for formatted value", zap.Any("type", reflect.TypeOf(x))) return "" } } // PromFormattedValue formats the value to be used in promql func PromFormattedValue(v interface{}) string { switch x := v.(type) { case int: return fmt.Sprintf("%d", x) case float32, float64: return fmt.Sprintf("%f", x) case string: return x case bool: return fmt.Sprintf("%v", x) case []interface{}: if len(x) == 0 { return "" } switch x[0].(type) { case string, int, float32, float64, bool: // list of values joined by | for promql - a value can contain whitespace var str []string for _, sVal := range x { str = append(str, fmt.Sprintf("%v", sVal)) } return strings.Join(str, "|") default: zap.L().Error("invalid type for prom formatted value", zap.Any("type", reflect.TypeOf(x[0]))) return "" } default: zap.L().Error("invalid type for prom formatted value", zap.Any("type", reflect.TypeOf(x))) return "" } }