Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
7b891d10
Unverified
Commit
7b891d10
authored
Sep 30, 2020
by
Carl Bergquist
Committed by
GitHub
Sep 30, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Instrumentation: Removes invalid chars from label names (#27921)
parent
e26b8636
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
68 additions
and
1 deletions
+68
-1
pkg/infra/metrics/metrics.go
+27
-0
pkg/infra/metrics/metrics_test.go
+32
-0
pkg/models/datasource_cache.go
+9
-1
No files found.
pkg/infra/metrics/metrics.go
View file @
7b891d10
package
metrics
package
metrics
import
(
import
(
"errors"
"fmt"
"runtime"
"runtime"
"strings"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus"
...
@@ -589,3 +592,27 @@ func newCounterStartingAtZero(opts prometheus.CounterOpts, labelValues ...string
...
@@ -589,3 +592,27 @@ func newCounterStartingAtZero(opts prometheus.CounterOpts, labelValues ...string
return
counter
return
counter
}
}
// SanitizeLabelName removes all invalid chars from the label name.
// If the label name is empty or contains only invalid chars, it
// will return an error.
func
SanitizeLabelName
(
name
string
)
(
string
,
error
)
{
if
len
(
name
)
==
0
{
return
""
,
errors
.
New
(
"label name cannot be empty"
)
}
out
:=
strings
.
Builder
{}
for
i
,
b
:=
range
name
{
if
(
b
>=
'a'
&&
b
<=
'z'
)
||
(
b
>=
'A'
&&
b
<=
'Z'
)
||
b
==
'_'
||
(
b
>=
'0'
&&
b
<=
'9'
&&
i
>
0
)
{
out
.
WriteRune
(
b
)
}
else
if
b
==
' '
{
out
.
WriteRune
(
'_'
)
}
}
if
out
.
Len
()
==
0
{
return
""
,
fmt
.
Errorf
(
"label name only contains invalid chars: %q"
,
name
)
}
return
out
.
String
(),
nil
}
pkg/infra/metrics/metrics_test.go
0 → 100644
View file @
7b891d10
package
metrics
import
(
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func
TestLabelNameSanitization
(
t
*
testing
.
T
)
{
testcases
:=
[]
struct
{
input
string
expected
string
err
bool
}{
{
input
:
"job"
,
expected
:
"job"
},
{
input
:
"job._loal['"
,
expected
:
"job_loal"
},
{
input
:
""
,
expected
:
""
,
err
:
true
},
{
input
:
";;;"
,
expected
:
""
,
err
:
true
},
{
input
:
"Data source"
,
expected
:
"Data_source"
},
}
for
_
,
tc
:=
range
testcases
{
got
,
err
:=
SanitizeLabelName
(
tc
.
input
)
if
tc
.
err
{
assert
.
Error
(
t
,
err
)
}
else
{
require
.
NoError
(
t
,
err
)
assert
.
Equal
(
t
,
tc
.
expected
,
got
)
}
}
}
pkg/models/datasource_cache.go
View file @
7b891d10
...
@@ -10,6 +10,7 @@ import (
...
@@ -10,6 +10,7 @@ import (
"sync"
"sync"
"time"
"time"
"github.com/grafana/grafana/pkg/infra/metrics"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/setting"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/client_golang/prometheus/promhttp"
...
@@ -72,7 +73,14 @@ type dataSourceTransport struct {
...
@@ -72,7 +73,14 @@ type dataSourceTransport struct {
func
instrumentRoundtrip
(
datasourceName
string
,
next
http
.
RoundTripper
)
promhttp
.
RoundTripperFunc
{
func
instrumentRoundtrip
(
datasourceName
string
,
next
http
.
RoundTripper
)
promhttp
.
RoundTripperFunc
{
return
promhttp
.
RoundTripperFunc
(
func
(
r
*
http
.
Request
)
(
*
http
.
Response
,
error
)
{
return
promhttp
.
RoundTripperFunc
(
func
(
r
*
http
.
Request
)
(
*
http
.
Response
,
error
)
{
datasourceLabel
:=
prometheus
.
Labels
{
"datasource"
:
datasourceName
}
datasourceLabelName
,
err
:=
metrics
.
SanitizeLabelName
(
datasourceName
)
// if the datasource named cannot be turned into a prometheus
// label we will skip instrumenting these metrics.
if
err
!=
nil
{
return
next
.
RoundTrip
(
r
)
}
datasourceLabel
:=
prometheus
.
Labels
{
"datasource"
:
datasourceLabelName
}
requestCounter
:=
datasourceRequestCounter
.
MustCurryWith
(
datasourceLabel
)
requestCounter
:=
datasourceRequestCounter
.
MustCurryWith
(
datasourceLabel
)
requestSummary
:=
datasourceRequestSummary
.
MustCurryWith
(
datasourceLabel
)
requestSummary
:=
datasourceRequestSummary
.
MustCurryWith
(
datasourceLabel
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment