Skip to content

Commit 3b6ccc6

Browse files
authored
Merge pull request #240 from prometheus/beorn7/utf-8
Add option to negotiate UTF-8 names
2 parents 3392379 + f338eaf commit 3b6ccc6

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

cmd/prom2json/main.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,18 @@ Examples:
4141
`
4242

4343
func main() {
44-
cert := kingpin.Flag("cert", "client certificate file").String()
45-
key := kingpin.Flag("key", "client certificate's key file").String()
44+
cert := kingpin.Flag("cert", "client certificate file").PlaceHolder("FILE").String()
45+
key := kingpin.Flag("key", "client certificate's key file").PlaceHolder("FILE").String()
4646
skipServerCertCheck := kingpin.Flag("accept-invalid-cert", "Accept any certificate during TLS handshake. Insecure, use only for testing.").Bool()
47+
escapingScheme := kingpin.Flag("escaping", "Sets an escaping scheme in content negotiation. Use 'allow-utf-8' for full UTF-8 character support.").
48+
PlaceHolder("SCHEME").
49+
Enum(
50+
"allow-utf-8",
51+
"underscores",
52+
"dots",
53+
"values",
54+
)
55+
4756
kingpin.CommandLine.UsageWriter(os.Stderr)
4857
kingpin.Version(version.Print("prom2json"))
4958
kingpin.HelpFlag.Short('h')
@@ -88,8 +97,7 @@ func main() {
8897
os.Exit(1)
8998
}
9099
go func() {
91-
err := prom2json.FetchMetricFamilies(*arg, mfChan, transport)
92-
if err != nil {
100+
if err := prom2json.FetchMetricFamiliesWithEscapingScheme(*arg, mfChan, transport, *escapingScheme); err != nil {
93101
fmt.Fprintln(os.Stderr, err)
94102
os.Exit(1)
95103
}

prom2json.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,15 @@ import (
2727
"github.com/prometheus/prom2json/histogram"
2828
)
2929

30-
const acceptHeader = `application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.7,text/plain;version=0.0.4;q=0.3`
30+
const (
31+
acceptHeader = `application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.7,text/plain;version=1.0.0;q=0.2,text/plain;version=0.0.4;q=0.1`
32+
// acceptHeaderTemplate takes the escaping scheme as its single
33+
// parameter. Note that we even add the parameter to
34+
// text/plain;version=0.0.4. This version officially does not support
35+
// escaping scheme selection, but some targets implement it anyway, so
36+
// no harm in trying.
37+
acceptHeaderTemplate = `application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;escaping=%[1]s;q=0.7,text/plain;version=1.0.0;escaping=%[1]s;q=0.2,text/plain;version=0.0.4;escaping=%[1]s;q=0.1`
38+
)
3139

3240
// Family mirrors the MetricFamily proto message.
3341
type Family struct {
@@ -177,12 +185,23 @@ func makeBuckets(m *dto.Metric) map[string]string {
177185
// returns after all MetricFamilies have been sent. The provided transport
178186
// may be nil (in which case the default Transport is used).
179187
func FetchMetricFamilies(url string, ch chan<- *dto.MetricFamily, transport http.RoundTripper) error {
188+
return FetchMetricFamiliesWithEscapingScheme(url, ch, transport, "")
189+
}
190+
191+
// FetchMetricFamiliesWithEscapingScheme works like FetchMetricFamilies but adds
192+
// the provided string as the value of the additional 'escaping' parameter in
193+
// the accept header.
194+
func FetchMetricFamiliesWithEscapingScheme(url string, ch chan<- *dto.MetricFamily, transport http.RoundTripper, escapingScheme string) error {
180195
req, err := http.NewRequest("GET", url, nil)
181196
if err != nil {
182197
close(ch)
183198
return fmt.Errorf("creating GET request for URL %q failed: %w", url, err)
184199
}
185-
req.Header.Add("Accept", acceptHeader)
200+
if escapingScheme != "" {
201+
req.Header.Add("Accept", fmt.Sprintf(acceptHeaderTemplate, escapingScheme))
202+
} else {
203+
req.Header.Add("Accept", acceptHeader)
204+
}
186205
client := http.Client{Transport: transport}
187206
resp, err := client.Do(req)
188207
if err != nil {

0 commit comments

Comments
 (0)