// Copyright 2013 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package strutil import ( "fmt" "net/url" "strings" ) // TableLinkForExpression creates an escaped relative link to the table view of // the provided expression. func TableLinkForExpression(expr string) string { escapedExpression := url.QueryEscape(expr) return fmt.Sprintf("/graph?g0.expr=%s&g0.tab=1", escapedExpression) } // GraphLinkForExpression creates an escaped relative link to the graph view of // the provided expression. func GraphLinkForExpression(expr string) string { escapedExpression := url.QueryEscape(expr) return fmt.Sprintf("/graph?g0.expr=%s&g0.tab=0", escapedExpression) } // SanitizeLabelName replaces any invalid character with an underscore, and if // given an empty string, returns a string containing a single underscore. func SanitizeLabelName(name string) string { if len(name) == 0 { return "_" } var validSb strings.Builder for i, b := range name { if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { validSb.WriteRune('_') } else { validSb.WriteRune(b) } } return validSb.String() }