Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
9e55995a
Unverified
Commit
9e55995a
authored
Feb 19, 2019
by
Kubernetes Prow Robot
Committed by
GitHub
Feb 19, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #73989 from oomichi/golint-e2e-framework-metrics
Fix golint failures under test/e2e/framework/metrics
parents
e1b8cb51
89f6f1d0
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
110 additions
and
90 deletions
+110
-90
.golint_failures
hack/.golint_failures
+0
-1
framework.go
test/e2e/framework/framework.go
+1
-1
api_server_metrics.go
test/e2e/framework/metrics/api_server_metrics.go
+10
-8
cluster_autoscaler_metrics.go
test/e2e/framework/metrics/cluster_autoscaler_metrics.go
+4
-2
controller_manager_metrics.go
test/e2e/framework/metrics/controller_manager_metrics.go
+4
-2
generic_metrics.go
test/e2e/framework/metrics/generic_metrics.go
+3
-21
kubelet_metrics.go
test/e2e/framework/metrics/kubelet_metrics.go
+9
-2
metrics_grabber.go
test/e2e/framework/metrics/metrics_grabber.go
+36
-32
scheduler_metrics.go
test/e2e/framework/metrics/scheduler_metrics.go
+4
-2
metrics_util.go
test/e2e/framework/metrics_util.go
+33
-13
metrics_grabber.go
test/e2e/instrumentation/monitoring/metrics_grabber.go
+2
-2
volume_metrics.go
test/e2e/storage/volume_metrics.go
+4
-4
No files found.
hack/.golint_failures
View file @
9e55995a
...
@@ -674,7 +674,6 @@ test/e2e/cloud
...
@@ -674,7 +674,6 @@ test/e2e/cloud
test/e2e/common
test/e2e/common
test/e2e/framework
test/e2e/framework
test/e2e/framework/ingress
test/e2e/framework/ingress
test/e2e/framework/metrics
test/e2e/framework/providers/aws
test/e2e/framework/providers/aws
test/e2e/framework/providers/azure
test/e2e/framework/providers/azure
test/e2e/framework/providers/gce
test/e2e/framework/providers/gce
...
...
test/e2e/framework/framework.go
View file @
9e55995a
...
@@ -119,7 +119,7 @@ type Framework struct {
...
@@ -119,7 +119,7 @@ type Framework struct {
TestSummaries
[]
TestDataSummary
TestSummaries
[]
TestDataSummary
// Place to keep ClusterAutoscaler metrics from before test in order to compute delta.
// Place to keep ClusterAutoscaler metrics from before test in order to compute delta.
clusterAutoscalerMetricsBeforeTest
metrics
.
Metrics
Collection
clusterAutoscalerMetricsBeforeTest
metrics
.
Collection
}
}
type
TestDataSummary
interface
{
type
TestDataSummary
interface
{
...
...
test/e2e/framework/metrics/api_server_metrics.go
View file @
9e55995a
...
@@ -16,26 +16,28 @@ limitations under the License.
...
@@ -16,26 +16,28 @@ limitations under the License.
package
metrics
package
metrics
type
ApiServerMetrics
Metrics
// APIServerMetrics is metrics for API server
type
APIServerMetrics
Metrics
func
(
m
*
ApiServerMetrics
)
Equal
(
o
ApiServerMetrics
)
bool
{
// Equal returns true if all metrics are the same as the arguments.
func
(
m
*
APIServerMetrics
)
Equal
(
o
APIServerMetrics
)
bool
{
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
}
}
func
NewApiServerMetrics
()
Api
ServerMetrics
{
func
newAPIServerMetrics
()
API
ServerMetrics
{
result
:=
NewMetrics
()
result
:=
NewMetrics
()
return
A
pi
ServerMetrics
(
result
)
return
A
PI
ServerMetrics
(
result
)
}
}
func
parseA
piServerMetrics
(
data
string
)
(
Api
ServerMetrics
,
error
)
{
func
parseA
PIServerMetrics
(
data
string
)
(
API
ServerMetrics
,
error
)
{
result
:=
NewApi
ServerMetrics
()
result
:=
newAPI
ServerMetrics
()
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
return
A
pi
ServerMetrics
{},
err
return
A
PI
ServerMetrics
{},
err
}
}
return
result
,
nil
return
result
,
nil
}
}
func
(
g
*
MetricsGrabber
)
getMetricsFromApi
Server
()
(
string
,
error
)
{
func
(
g
*
Grabber
)
getMetricsFromAPI
Server
()
(
string
,
error
)
{
rawOutput
,
err
:=
g
.
client
.
CoreV1
()
.
RESTClient
()
.
Get
()
.
RequestURI
(
"/metrics"
)
.
Do
()
.
Raw
()
rawOutput
,
err
:=
g
.
client
.
CoreV1
()
.
RESTClient
()
.
Get
()
.
RequestURI
(
"/metrics"
)
.
Do
()
.
Raw
()
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
err
return
""
,
err
...
...
test/e2e/framework/metrics/cluster_autoscaler_metrics.go
View file @
9e55995a
...
@@ -16,19 +16,21 @@ limitations under the License.
...
@@ -16,19 +16,21 @@ limitations under the License.
package
metrics
package
metrics
// ClusterAutoscalerMetrics is metrics for cluster autoscaller
type
ClusterAutoscalerMetrics
Metrics
type
ClusterAutoscalerMetrics
Metrics
// Equal returns true if all metrics are the same as the arguments.
func
(
m
*
ClusterAutoscalerMetrics
)
Equal
(
o
ClusterAutoscalerMetrics
)
bool
{
func
(
m
*
ClusterAutoscalerMetrics
)
Equal
(
o
ClusterAutoscalerMetrics
)
bool
{
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
}
}
func
N
ewClusterAutoscalerMetrics
()
ClusterAutoscalerMetrics
{
func
n
ewClusterAutoscalerMetrics
()
ClusterAutoscalerMetrics
{
result
:=
NewMetrics
()
result
:=
NewMetrics
()
return
ClusterAutoscalerMetrics
(
result
)
return
ClusterAutoscalerMetrics
(
result
)
}
}
func
parseClusterAutoscalerMetrics
(
data
string
)
(
ClusterAutoscalerMetrics
,
error
)
{
func
parseClusterAutoscalerMetrics
(
data
string
)
(
ClusterAutoscalerMetrics
,
error
)
{
result
:=
N
ewClusterAutoscalerMetrics
()
result
:=
n
ewClusterAutoscalerMetrics
()
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
return
ClusterAutoscalerMetrics
{},
err
return
ClusterAutoscalerMetrics
{},
err
}
}
...
...
test/e2e/framework/metrics/controller_manager_metrics.go
View file @
9e55995a
...
@@ -16,19 +16,21 @@ limitations under the License.
...
@@ -16,19 +16,21 @@ limitations under the License.
package
metrics
package
metrics
// ControllerManagerMetrics is metrics for controller manager
type
ControllerManagerMetrics
Metrics
type
ControllerManagerMetrics
Metrics
// Equal returns true if all metrics are the same as the arguments.
func
(
m
*
ControllerManagerMetrics
)
Equal
(
o
ControllerManagerMetrics
)
bool
{
func
(
m
*
ControllerManagerMetrics
)
Equal
(
o
ControllerManagerMetrics
)
bool
{
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
}
}
func
N
ewControllerManagerMetrics
()
ControllerManagerMetrics
{
func
n
ewControllerManagerMetrics
()
ControllerManagerMetrics
{
result
:=
NewMetrics
()
result
:=
NewMetrics
()
return
ControllerManagerMetrics
(
result
)
return
ControllerManagerMetrics
(
result
)
}
}
func
parseControllerManagerMetrics
(
data
string
)
(
ControllerManagerMetrics
,
error
)
{
func
parseControllerManagerMetrics
(
data
string
)
(
ControllerManagerMetrics
,
error
)
{
result
:=
N
ewControllerManagerMetrics
()
result
:=
n
ewControllerManagerMetrics
()
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
return
ControllerManagerMetrics
{},
err
return
ControllerManagerMetrics
{},
err
}
}
...
...
test/e2e/framework/metrics/generic_metrics.go
View file @
9e55995a
...
@@ -17,7 +17,6 @@ limitations under the License.
...
@@ -17,7 +17,6 @@ limitations under the License.
package
metrics
package
metrics
import
(
import
(
"fmt"
"io"
"io"
"reflect"
"reflect"
"strings"
"strings"
...
@@ -27,8 +26,10 @@ import (
...
@@ -27,8 +26,10 @@ import (
"k8s.io/klog"
"k8s.io/klog"
)
)
// Metrics is generic metrics for other specific metrics
type
Metrics
map
[
string
]
model
.
Samples
type
Metrics
map
[
string
]
model
.
Samples
// Equal returns true if all metrics are the same as the arguments.
func
(
m
*
Metrics
)
Equal
(
o
Metrics
)
bool
{
func
(
m
*
Metrics
)
Equal
(
o
Metrics
)
bool
{
leftKeySet
:=
[]
string
{}
leftKeySet
:=
[]
string
{}
rightKeySet
:=
[]
string
{}
rightKeySet
:=
[]
string
{}
...
@@ -49,26 +50,7 @@ func (m *Metrics) Equal(o Metrics) bool {
...
@@ -49,26 +50,7 @@ func (m *Metrics) Equal(o Metrics) bool {
return
true
return
true
}
}
func
PrintSample
(
sample
*
model
.
Sample
)
string
{
// NewMetrics returns new metrics which are initialized.
buf
:=
make
([]
string
,
0
)
// Id is a VERY special label. For 'normal' container it's useless, but it's necessary
// for 'system' containers (e.g. /docker-daemon, /kubelet, etc.). We know if that's the
// case by checking if there's a label "kubernetes_container_name" present. It's hacky
// but it works...
_
,
normalContainer
:=
sample
.
Metric
[
"kubernetes_container_name"
]
for
k
,
v
:=
range
sample
.
Metric
{
if
strings
.
HasPrefix
(
string
(
k
),
"__"
)
{
continue
}
if
string
(
k
)
==
"id"
&&
normalContainer
{
continue
}
buf
=
append
(
buf
,
fmt
.
Sprintf
(
"%v=%v"
,
string
(
k
),
v
))
}
return
fmt
.
Sprintf
(
"[%v] = %v"
,
strings
.
Join
(
buf
,
","
),
sample
.
Value
)
}
func
NewMetrics
()
Metrics
{
func
NewMetrics
()
Metrics
{
result
:=
make
(
Metrics
)
result
:=
make
(
Metrics
)
return
result
return
result
...
...
test/e2e/framework/metrics/kubelet_metrics.go
View file @
9e55995a
...
@@ -23,12 +23,19 @@ import (
...
@@ -23,12 +23,19 @@ import (
"time"
"time"
)
)
const
(
proxyTimeout
=
2
*
time
.
Minute
)
// KubeletMetrics is metrics for kubelet
type
KubeletMetrics
Metrics
type
KubeletMetrics
Metrics
// Equal returns true if all metrics are the same as the arguments.
func
(
m
*
KubeletMetrics
)
Equal
(
o
KubeletMetrics
)
bool
{
func
(
m
*
KubeletMetrics
)
Equal
(
o
KubeletMetrics
)
bool
{
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
}
}
// NewKubeletMetrics returns new metrics which are initialized.
func
NewKubeletMetrics
()
KubeletMetrics
{
func
NewKubeletMetrics
()
KubeletMetrics
{
result
:=
NewMetrics
()
result
:=
NewMetrics
()
return
KubeletMetrics
(
result
)
return
KubeletMetrics
(
result
)
...
@@ -58,7 +65,7 @@ func parseKubeletMetrics(data string) (KubeletMetrics, error) {
...
@@ -58,7 +65,7 @@ func parseKubeletMetrics(data string) (KubeletMetrics, error) {
return
result
,
nil
return
result
,
nil
}
}
func
(
g
*
Metrics
Grabber
)
getMetricsFromNode
(
nodeName
string
,
kubeletPort
int
)
(
string
,
error
)
{
func
(
g
*
Grabber
)
getMetricsFromNode
(
nodeName
string
,
kubeletPort
int
)
(
string
,
error
)
{
// There's a problem with timing out during proxy. Wrapping this in a goroutine to prevent deadlock.
// There's a problem with timing out during proxy. Wrapping this in a goroutine to prevent deadlock.
// Hanging goroutine will be leaked.
// Hanging goroutine will be leaked.
finished
:=
make
(
chan
struct
{})
finished
:=
make
(
chan
struct
{})
...
@@ -74,7 +81,7 @@ func (g *MetricsGrabber) getMetricsFromNode(nodeName string, kubeletPort int) (s
...
@@ -74,7 +81,7 @@ func (g *MetricsGrabber) getMetricsFromNode(nodeName string, kubeletPort int) (s
finished
<-
struct
{}{}
finished
<-
struct
{}{}
}()
}()
select
{
select
{
case
<-
time
.
After
(
P
roxyTimeout
)
:
case
<-
time
.
After
(
p
roxyTimeout
)
:
return
""
,
fmt
.
Errorf
(
"Timed out when waiting for proxy to gather metrics from %v"
,
nodeName
)
return
""
,
fmt
.
Errorf
(
"Timed out when waiting for proxy to gather metrics from %v"
,
nodeName
)
case
<-
finished
:
case
<-
finished
:
if
err
!=
nil
{
if
err
!=
nil
{
...
...
test/e2e/framework/metrics/metrics_grabber.go
View file @
9e55995a
...
@@ -18,7 +18,6 @@ package metrics
...
@@ -18,7 +18,6 @@ package metrics
import
(
import
(
"fmt"
"fmt"
"time"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/fields"
...
@@ -30,22 +29,20 @@ import (
...
@@ -30,22 +29,20 @@ import (
"k8s.io/klog"
"k8s.io/klog"
)
)
const
(
// Collection is metrics collection of components
ProxyTimeout
=
2
*
time
.
Minute
type
Collection
struct
{
)
APIServerMetrics
APIServerMetrics
type
MetricsCollection
struct
{
ApiServerMetrics
ApiServerMetrics
ControllerManagerMetrics
ControllerManagerMetrics
ControllerManagerMetrics
ControllerManagerMetrics
KubeletMetrics
map
[
string
]
KubeletMetrics
KubeletMetrics
map
[
string
]
KubeletMetrics
SchedulerMetrics
SchedulerMetrics
SchedulerMetrics
SchedulerMetrics
ClusterAutoscalerMetrics
ClusterAutoscalerMetrics
ClusterAutoscalerMetrics
ClusterAutoscalerMetrics
}
}
type
MetricsGrabber
struct
{
// Grabber provides functions which grab metrics from components
type
Grabber
struct
{
client
clientset
.
Interface
client
clientset
.
Interface
externalClient
clientset
.
Interface
externalClient
clientset
.
Interface
grabFromA
pi
Server
bool
grabFromA
PI
Server
bool
grabFromControllerManager
bool
grabFromControllerManager
bool
grabFromKubelets
bool
grabFromKubelets
bool
grabFromScheduler
bool
grabFromScheduler
bool
...
@@ -54,7 +51,8 @@ type MetricsGrabber struct {
...
@@ -54,7 +51,8 @@ type MetricsGrabber struct {
registeredMaster
bool
registeredMaster
bool
}
}
func
NewMetricsGrabber
(
c
clientset
.
Interface
,
ec
clientset
.
Interface
,
kubelets
bool
,
scheduler
bool
,
controllers
bool
,
apiServer
bool
,
clusterAutoscaler
bool
)
(
*
MetricsGrabber
,
error
)
{
// NewMetricsGrabber returns new metrics which are initialized.
func
NewMetricsGrabber
(
c
clientset
.
Interface
,
ec
clientset
.
Interface
,
kubelets
bool
,
scheduler
bool
,
controllers
bool
,
apiServer
bool
,
clusterAutoscaler
bool
)
(
*
Grabber
,
error
)
{
registeredMaster
:=
false
registeredMaster
:=
false
masterName
:=
""
masterName
:=
""
nodeList
,
err
:=
c
.
CoreV1
()
.
Nodes
()
.
List
(
metav1
.
ListOptions
{})
nodeList
,
err
:=
c
.
CoreV1
()
.
Nodes
()
.
List
(
metav1
.
ListOptions
{})
...
@@ -82,10 +80,10 @@ func NewMetricsGrabber(c clientset.Interface, ec clientset.Interface, kubelets b
...
@@ -82,10 +80,10 @@ func NewMetricsGrabber(c clientset.Interface, ec clientset.Interface, kubelets b
}
}
}
}
return
&
Metrics
Grabber
{
return
&
Grabber
{
client
:
c
,
client
:
c
,
externalClient
:
ec
,
externalClient
:
ec
,
grabFromA
pi
Server
:
apiServer
,
grabFromA
PI
Server
:
apiServer
,
grabFromControllerManager
:
controllers
,
grabFromControllerManager
:
controllers
,
grabFromKubelets
:
kubelets
,
grabFromKubelets
:
kubelets
,
grabFromScheduler
:
scheduler
,
grabFromScheduler
:
scheduler
,
...
@@ -96,11 +94,12 @@ func NewMetricsGrabber(c clientset.Interface, ec clientset.Interface, kubelets b
...
@@ -96,11 +94,12 @@ func NewMetricsGrabber(c clientset.Interface, ec clientset.Interface, kubelets b
}
}
// HasRegisteredMaster returns if metrics grabber was able to find a master node
// HasRegisteredMaster returns if metrics grabber was able to find a master node
func
(
g
*
Metrics
Grabber
)
HasRegisteredMaster
()
bool
{
func
(
g
*
Grabber
)
HasRegisteredMaster
()
bool
{
return
g
.
registeredMaster
return
g
.
registeredMaster
}
}
func
(
g
*
MetricsGrabber
)
GrabFromKubelet
(
nodeName
string
)
(
KubeletMetrics
,
error
)
{
// GrabFromKubelet returns metrics from kubelet
func
(
g
*
Grabber
)
GrabFromKubelet
(
nodeName
string
)
(
KubeletMetrics
,
error
)
{
nodes
,
err
:=
g
.
client
.
CoreV1
()
.
Nodes
()
.
List
(
metav1
.
ListOptions
{
FieldSelector
:
fields
.
Set
{
api
.
ObjectNameField
:
nodeName
}
.
AsSelector
()
.
String
()})
nodes
,
err
:=
g
.
client
.
CoreV1
()
.
Nodes
()
.
List
(
metav1
.
ListOptions
{
FieldSelector
:
fields
.
Set
{
api
.
ObjectNameField
:
nodeName
}
.
AsSelector
()
.
String
()})
if
err
!=
nil
{
if
err
!=
nil
{
return
KubeletMetrics
{},
err
return
KubeletMetrics
{},
err
...
@@ -112,9 +111,9 @@ func (g *MetricsGrabber) GrabFromKubelet(nodeName string) (KubeletMetrics, error
...
@@ -112,9 +111,9 @@ func (g *MetricsGrabber) GrabFromKubelet(nodeName string) (KubeletMetrics, error
return
g
.
grabFromKubeletInternal
(
nodeName
,
int
(
kubeletPort
))
return
g
.
grabFromKubeletInternal
(
nodeName
,
int
(
kubeletPort
))
}
}
func
(
g
*
Metrics
Grabber
)
grabFromKubeletInternal
(
nodeName
string
,
kubeletPort
int
)
(
KubeletMetrics
,
error
)
{
func
(
g
*
Grabber
)
grabFromKubeletInternal
(
nodeName
string
,
kubeletPort
int
)
(
KubeletMetrics
,
error
)
{
if
kubeletPort
<=
0
||
kubeletPort
>
65535
{
if
kubeletPort
<=
0
||
kubeletPort
>
65535
{
return
KubeletMetrics
{},
fmt
.
Errorf
(
"Invalid Kubelet port %v. Skipping Kubelet's metrics gathering
.
"
,
kubeletPort
)
return
KubeletMetrics
{},
fmt
.
Errorf
(
"Invalid Kubelet port %v. Skipping Kubelet's metrics gathering"
,
kubeletPort
)
}
}
output
,
err
:=
g
.
getMetricsFromNode
(
nodeName
,
int
(
kubeletPort
))
output
,
err
:=
g
.
getMetricsFromNode
(
nodeName
,
int
(
kubeletPort
))
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -123,9 +122,10 @@ func (g *MetricsGrabber) grabFromKubeletInternal(nodeName string, kubeletPort in
...
@@ -123,9 +122,10 @@ func (g *MetricsGrabber) grabFromKubeletInternal(nodeName string, kubeletPort in
return
parseKubeletMetrics
(
output
)
return
parseKubeletMetrics
(
output
)
}
}
func
(
g
*
MetricsGrabber
)
GrabFromScheduler
()
(
SchedulerMetrics
,
error
)
{
// GrabFromScheduler returns metrics from scheduler
func
(
g
*
Grabber
)
GrabFromScheduler
()
(
SchedulerMetrics
,
error
)
{
if
!
g
.
registeredMaster
{
if
!
g
.
registeredMaster
{
return
SchedulerMetrics
{},
fmt
.
Errorf
(
"Master's Kubelet is not registered. Skipping Scheduler's metrics gathering
.
"
)
return
SchedulerMetrics
{},
fmt
.
Errorf
(
"Master's Kubelet is not registered. Skipping Scheduler's metrics gathering"
)
}
}
output
,
err
:=
g
.
getMetricsFromPod
(
g
.
client
,
fmt
.
Sprintf
(
"%v-%v"
,
"kube-scheduler"
,
g
.
masterName
),
metav1
.
NamespaceSystem
,
ports
.
InsecureSchedulerPort
)
output
,
err
:=
g
.
getMetricsFromPod
(
g
.
client
,
fmt
.
Sprintf
(
"%v-%v"
,
"kube-scheduler"
,
g
.
masterName
),
metav1
.
NamespaceSystem
,
ports
.
InsecureSchedulerPort
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -134,9 +134,10 @@ func (g *MetricsGrabber) GrabFromScheduler() (SchedulerMetrics, error) {
...
@@ -134,9 +134,10 @@ func (g *MetricsGrabber) GrabFromScheduler() (SchedulerMetrics, error) {
return
parseSchedulerMetrics
(
output
)
return
parseSchedulerMetrics
(
output
)
}
}
func
(
g
*
MetricsGrabber
)
GrabFromClusterAutoscaler
()
(
ClusterAutoscalerMetrics
,
error
)
{
// GrabFromClusterAutoscaler returns metrics from cluster autoscaler
func
(
g
*
Grabber
)
GrabFromClusterAutoscaler
()
(
ClusterAutoscalerMetrics
,
error
)
{
if
!
g
.
registeredMaster
&&
g
.
externalClient
==
nil
{
if
!
g
.
registeredMaster
&&
g
.
externalClient
==
nil
{
return
ClusterAutoscalerMetrics
{},
fmt
.
Errorf
(
"Master's Kubelet is not registered. Skipping ClusterAutoscaler's metrics gathering
.
"
)
return
ClusterAutoscalerMetrics
{},
fmt
.
Errorf
(
"Master's Kubelet is not registered. Skipping ClusterAutoscaler's metrics gathering"
)
}
}
var
client
clientset
.
Interface
var
client
clientset
.
Interface
var
namespace
string
var
namespace
string
...
@@ -154,9 +155,10 @@ func (g *MetricsGrabber) GrabFromClusterAutoscaler() (ClusterAutoscalerMetrics,
...
@@ -154,9 +155,10 @@ func (g *MetricsGrabber) GrabFromClusterAutoscaler() (ClusterAutoscalerMetrics,
return
parseClusterAutoscalerMetrics
(
output
)
return
parseClusterAutoscalerMetrics
(
output
)
}
}
func
(
g
*
MetricsGrabber
)
GrabFromControllerManager
()
(
ControllerManagerMetrics
,
error
)
{
// GrabFromControllerManager returns metrics from controller manager
func
(
g
*
Grabber
)
GrabFromControllerManager
()
(
ControllerManagerMetrics
,
error
)
{
if
!
g
.
registeredMaster
{
if
!
g
.
registeredMaster
{
return
ControllerManagerMetrics
{},
fmt
.
Errorf
(
"Master's Kubelet is not registered. Skipping ControllerManager's metrics gathering
.
"
)
return
ControllerManagerMetrics
{},
fmt
.
Errorf
(
"Master's Kubelet is not registered. Skipping ControllerManager's metrics gathering"
)
}
}
output
,
err
:=
g
.
getMetricsFromPod
(
g
.
client
,
fmt
.
Sprintf
(
"%v-%v"
,
"kube-controller-manager"
,
g
.
masterName
),
metav1
.
NamespaceSystem
,
ports
.
InsecureKubeControllerManagerPort
)
output
,
err
:=
g
.
getMetricsFromPod
(
g
.
client
,
fmt
.
Sprintf
(
"%v-%v"
,
"kube-controller-manager"
,
g
.
masterName
),
metav1
.
NamespaceSystem
,
ports
.
InsecureKubeControllerManagerPort
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -165,23 +167,25 @@ func (g *MetricsGrabber) GrabFromControllerManager() (ControllerManagerMetrics,
...
@@ -165,23 +167,25 @@ func (g *MetricsGrabber) GrabFromControllerManager() (ControllerManagerMetrics,
return
parseControllerManagerMetrics
(
output
)
return
parseControllerManagerMetrics
(
output
)
}
}
func
(
g
*
MetricsGrabber
)
GrabFromApiServer
()
(
ApiServerMetrics
,
error
)
{
// GrabFromAPIServer returns metrics from API server
output
,
err
:=
g
.
getMetricsFromApiServer
()
func
(
g
*
Grabber
)
GrabFromAPIServer
()
(
APIServerMetrics
,
error
)
{
output
,
err
:=
g
.
getMetricsFromAPIServer
()
if
err
!=
nil
{
if
err
!=
nil
{
return
A
pi
ServerMetrics
{},
nil
return
A
PI
ServerMetrics
{},
nil
}
}
return
parseA
pi
ServerMetrics
(
output
)
return
parseA
PI
ServerMetrics
(
output
)
}
}
func
(
g
*
MetricsGrabber
)
Grab
()
(
MetricsCollection
,
error
)
{
// Grab returns metrics from corresponding component
result
:=
MetricsCollection
{}
func
(
g
*
Grabber
)
Grab
()
(
Collection
,
error
)
{
result
:=
Collection
{}
var
errs
[]
error
var
errs
[]
error
if
g
.
grabFromA
pi
Server
{
if
g
.
grabFromA
PI
Server
{
metrics
,
err
:=
g
.
GrabFromA
pi
Server
()
metrics
,
err
:=
g
.
GrabFromA
PI
Server
()
if
err
!=
nil
{
if
err
!=
nil
{
errs
=
append
(
errs
,
err
)
errs
=
append
(
errs
,
err
)
}
else
{
}
else
{
result
.
A
pi
ServerMetrics
=
metrics
result
.
A
PI
ServerMetrics
=
metrics
}
}
}
}
if
g
.
grabFromScheduler
{
if
g
.
grabFromScheduler
{
...
@@ -230,7 +234,7 @@ func (g *MetricsGrabber) Grab() (MetricsCollection, error) {
...
@@ -230,7 +234,7 @@ func (g *MetricsGrabber) Grab() (MetricsCollection, error) {
return
result
,
nil
return
result
,
nil
}
}
func
(
g
*
Metrics
Grabber
)
getMetricsFromPod
(
client
clientset
.
Interface
,
podName
string
,
namespace
string
,
port
int
)
(
string
,
error
)
{
func
(
g
*
Grabber
)
getMetricsFromPod
(
client
clientset
.
Interface
,
podName
string
,
namespace
string
,
port
int
)
(
string
,
error
)
{
rawOutput
,
err
:=
client
.
CoreV1
()
.
RESTClient
()
.
Get
()
.
rawOutput
,
err
:=
client
.
CoreV1
()
.
RESTClient
()
.
Get
()
.
Namespace
(
namespace
)
.
Namespace
(
namespace
)
.
Resource
(
"pods"
)
.
Resource
(
"pods"
)
.
...
...
test/e2e/framework/metrics/scheduler_metrics.go
View file @
9e55995a
...
@@ -16,19 +16,21 @@ limitations under the License.
...
@@ -16,19 +16,21 @@ limitations under the License.
package
metrics
package
metrics
// SchedulerMetrics is metrics for scheduler
type
SchedulerMetrics
Metrics
type
SchedulerMetrics
Metrics
// Equal returns true if all metrics are the same as the arguments.
func
(
m
*
SchedulerMetrics
)
Equal
(
o
SchedulerMetrics
)
bool
{
func
(
m
*
SchedulerMetrics
)
Equal
(
o
SchedulerMetrics
)
bool
{
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
return
(
*
Metrics
)(
m
)
.
Equal
(
Metrics
(
o
))
}
}
func
N
ewSchedulerMetrics
()
SchedulerMetrics
{
func
n
ewSchedulerMetrics
()
SchedulerMetrics
{
result
:=
NewMetrics
()
result
:=
NewMetrics
()
return
SchedulerMetrics
(
result
)
return
SchedulerMetrics
(
result
)
}
}
func
parseSchedulerMetrics
(
data
string
)
(
SchedulerMetrics
,
error
)
{
func
parseSchedulerMetrics
(
data
string
)
(
SchedulerMetrics
,
error
)
{
result
:=
N
ewSchedulerMetrics
()
result
:=
n
ewSchedulerMetrics
()
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
if
err
:=
parseMetrics
(
data
,
(
*
Metrics
)(
&
result
));
err
!=
nil
{
return
SchedulerMetrics
{},
err
return
SchedulerMetrics
{},
err
}
}
...
...
test/e2e/framework/metrics_util.go
View file @
9e55995a
...
@@ -65,12 +65,12 @@ const (
...
@@ -65,12 +65,12 @@ const (
caFunctionMetricLabel
=
"function"
caFunctionMetricLabel
=
"function"
)
)
type
MetricsForE2E
metrics
.
Metrics
Collection
type
MetricsForE2E
metrics
.
Collection
func
(
m
*
MetricsForE2E
)
filterMetrics
()
{
func
(
m
*
MetricsForE2E
)
filterMetrics
()
{
interestingA
piServerMetrics
:=
make
(
metrics
.
Api
ServerMetrics
)
interestingA
PIServerMetrics
:=
make
(
metrics
.
API
ServerMetrics
)
for
_
,
metric
:=
range
InterestingA
pi
ServerMetrics
{
for
_
,
metric
:=
range
InterestingA
PI
ServerMetrics
{
interestingA
piServerMetrics
[
metric
]
=
(
*
m
)
.
Api
ServerMetrics
[
metric
]
interestingA
PIServerMetrics
[
metric
]
=
(
*
m
)
.
API
ServerMetrics
[
metric
]
}
}
interestingControllerManagerMetrics
:=
make
(
metrics
.
ControllerManagerMetrics
)
interestingControllerManagerMetrics
:=
make
(
metrics
.
ControllerManagerMetrics
)
for
_
,
metric
:=
range
InterestingControllerManagerMetrics
{
for
_
,
metric
:=
range
InterestingControllerManagerMetrics
{
...
@@ -87,29 +87,49 @@ func (m *MetricsForE2E) filterMetrics() {
...
@@ -87,29 +87,49 @@ func (m *MetricsForE2E) filterMetrics() {
interestingKubeletMetrics
[
kubelet
][
metric
]
=
grabbed
[
metric
]
interestingKubeletMetrics
[
kubelet
][
metric
]
=
grabbed
[
metric
]
}
}
}
}
(
*
m
)
.
A
piServerMetrics
=
interestingApi
ServerMetrics
(
*
m
)
.
A
PIServerMetrics
=
interestingAPI
ServerMetrics
(
*
m
)
.
ControllerManagerMetrics
=
interestingControllerManagerMetrics
(
*
m
)
.
ControllerManagerMetrics
=
interestingControllerManagerMetrics
(
*
m
)
.
KubeletMetrics
=
interestingKubeletMetrics
(
*
m
)
.
KubeletMetrics
=
interestingKubeletMetrics
}
}
func
printSample
(
sample
*
model
.
Sample
)
string
{
buf
:=
make
([]
string
,
0
)
// Id is a VERY special label. For 'normal' container it's useless, but it's necessary
// for 'system' containers (e.g. /docker-daemon, /kubelet, etc.). We know if that's the
// case by checking if there's a label "kubernetes_container_name" present. It's hacky
// but it works...
_
,
normalContainer
:=
sample
.
Metric
[
"kubernetes_container_name"
]
for
k
,
v
:=
range
sample
.
Metric
{
if
strings
.
HasPrefix
(
string
(
k
),
"__"
)
{
continue
}
if
string
(
k
)
==
"id"
&&
normalContainer
{
continue
}
buf
=
append
(
buf
,
fmt
.
Sprintf
(
"%v=%v"
,
string
(
k
),
v
))
}
return
fmt
.
Sprintf
(
"[%v] = %v"
,
strings
.
Join
(
buf
,
","
),
sample
.
Value
)
}
func
(
m
*
MetricsForE2E
)
PrintHumanReadable
()
string
{
func
(
m
*
MetricsForE2E
)
PrintHumanReadable
()
string
{
buf
:=
bytes
.
Buffer
{}
buf
:=
bytes
.
Buffer
{}
for
_
,
interestingMetric
:=
range
InterestingA
pi
ServerMetrics
{
for
_
,
interestingMetric
:=
range
InterestingA
PI
ServerMetrics
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"For %v:
\n
"
,
interestingMetric
))
buf
.
WriteString
(
fmt
.
Sprintf
(
"For %v:
\n
"
,
interestingMetric
))
for
_
,
sample
:=
range
(
*
m
)
.
A
pi
ServerMetrics
[
interestingMetric
]
{
for
_
,
sample
:=
range
(
*
m
)
.
A
PI
ServerMetrics
[
interestingMetric
]
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
%v
\n
"
,
metrics
.
P
rintSample
(
sample
)))
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
%v
\n
"
,
p
rintSample
(
sample
)))
}
}
}
}
for
_
,
interestingMetric
:=
range
InterestingControllerManagerMetrics
{
for
_
,
interestingMetric
:=
range
InterestingControllerManagerMetrics
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"For %v:
\n
"
,
interestingMetric
))
buf
.
WriteString
(
fmt
.
Sprintf
(
"For %v:
\n
"
,
interestingMetric
))
for
_
,
sample
:=
range
(
*
m
)
.
ControllerManagerMetrics
[
interestingMetric
]
{
for
_
,
sample
:=
range
(
*
m
)
.
ControllerManagerMetrics
[
interestingMetric
]
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
%v
\n
"
,
metrics
.
P
rintSample
(
sample
)))
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
%v
\n
"
,
p
rintSample
(
sample
)))
}
}
}
}
for
_
,
interestingMetric
:=
range
InterestingClusterAutoscalerMetrics
{
for
_
,
interestingMetric
:=
range
InterestingClusterAutoscalerMetrics
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"For %v:
\n
"
,
interestingMetric
))
buf
.
WriteString
(
fmt
.
Sprintf
(
"For %v:
\n
"
,
interestingMetric
))
for
_
,
sample
:=
range
(
*
m
)
.
ClusterAutoscalerMetrics
[
interestingMetric
]
{
for
_
,
sample
:=
range
(
*
m
)
.
ClusterAutoscalerMetrics
[
interestingMetric
]
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
%v
\n
"
,
metrics
.
P
rintSample
(
sample
)))
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
%v
\n
"
,
p
rintSample
(
sample
)))
}
}
}
}
for
kubelet
,
grabbed
:=
range
(
*
m
)
.
KubeletMetrics
{
for
kubelet
,
grabbed
:=
range
(
*
m
)
.
KubeletMetrics
{
...
@@ -117,7 +137,7 @@ func (m *MetricsForE2E) PrintHumanReadable() string {
...
@@ -117,7 +137,7 @@ func (m *MetricsForE2E) PrintHumanReadable() string {
for
_
,
interestingMetric
:=
range
InterestingKubeletMetrics
{
for
_
,
interestingMetric
:=
range
InterestingKubeletMetrics
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
For %v:
\n
"
,
interestingMetric
))
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t
For %v:
\n
"
,
interestingMetric
))
for
_
,
sample
:=
range
grabbed
[
interestingMetric
]
{
for
_
,
sample
:=
range
grabbed
[
interestingMetric
]
{
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t\t
%v
\n
"
,
metrics
.
P
rintSample
(
sample
)))
buf
.
WriteString
(
fmt
.
Sprintf
(
"
\t\t
%v
\n
"
,
p
rintSample
(
sample
)))
}
}
}
}
}
}
...
@@ -135,7 +155,7 @@ func (m *MetricsForE2E) SummaryKind() string {
...
@@ -135,7 +155,7 @@ func (m *MetricsForE2E) SummaryKind() string {
var
SchedulingLatencyMetricName
=
model
.
LabelValue
(
schedulermetric
.
SchedulerSubsystem
+
"_"
+
schedulermetric
.
SchedulingLatencyName
)
var
SchedulingLatencyMetricName
=
model
.
LabelValue
(
schedulermetric
.
SchedulerSubsystem
+
"_"
+
schedulermetric
.
SchedulingLatencyName
)
var
InterestingA
pi
ServerMetrics
=
[]
string
{
var
InterestingA
PI
ServerMetrics
=
[]
string
{
"apiserver_request_total"
,
"apiserver_request_total"
,
// TODO(krzysied): apiserver_request_latencies_summary is a deprecated metric.
// TODO(krzysied): apiserver_request_latencies_summary is a deprecated metric.
// It should be replaced with new metric.
// It should be replaced with new metric.
...
@@ -794,7 +814,7 @@ func PrintLatencies(latencies []PodLatencyData, header string) {
...
@@ -794,7 +814,7 @@ func PrintLatencies(latencies []PodLatencyData, header string) {
Logf
(
"perc50: %v, perc90: %v, perc99: %v"
,
metrics
.
Perc50
,
metrics
.
Perc90
,
metrics
.
Perc99
)
Logf
(
"perc50: %v, perc90: %v, perc99: %v"
,
metrics
.
Perc50
,
metrics
.
Perc90
,
metrics
.
Perc99
)
}
}
func
(
m
*
MetricsForE2E
)
computeClusterAutoscalerMetricsDelta
(
before
metrics
.
Metrics
Collection
)
{
func
(
m
*
MetricsForE2E
)
computeClusterAutoscalerMetricsDelta
(
before
metrics
.
Collection
)
{
if
beforeSamples
,
found
:=
before
.
ClusterAutoscalerMetrics
[
caFunctionMetric
];
found
{
if
beforeSamples
,
found
:=
before
.
ClusterAutoscalerMetrics
[
caFunctionMetric
];
found
{
if
afterSamples
,
found
:=
m
.
ClusterAutoscalerMetrics
[
caFunctionMetric
];
found
{
if
afterSamples
,
found
:=
m
.
ClusterAutoscalerMetrics
[
caFunctionMetric
];
found
{
beforeSamplesMap
:=
make
(
map
[
string
]
*
model
.
Sample
)
beforeSamplesMap
:=
make
(
map
[
string
]
*
model
.
Sample
)
...
...
test/e2e/instrumentation/monitoring/metrics_grabber.go
View file @
9e55995a
...
@@ -32,7 +32,7 @@ import (
...
@@ -32,7 +32,7 @@ import (
var
_
=
instrumentation
.
SIGDescribe
(
"MetricsGrabber"
,
func
()
{
var
_
=
instrumentation
.
SIGDescribe
(
"MetricsGrabber"
,
func
()
{
f
:=
framework
.
NewDefaultFramework
(
"metrics-grabber"
)
f
:=
framework
.
NewDefaultFramework
(
"metrics-grabber"
)
var
c
,
ec
clientset
.
Interface
var
c
,
ec
clientset
.
Interface
var
grabber
*
metrics
.
Metrics
Grabber
var
grabber
*
metrics
.
Grabber
gin
.
BeforeEach
(
func
()
{
gin
.
BeforeEach
(
func
()
{
var
err
error
var
err
error
c
=
f
.
ClientSet
c
=
f
.
ClientSet
...
@@ -44,7 +44,7 @@ var _ = instrumentation.SIGDescribe("MetricsGrabber", func() {
...
@@ -44,7 +44,7 @@ var _ = instrumentation.SIGDescribe("MetricsGrabber", func() {
gin
.
It
(
"should grab all metrics from API server."
,
func
()
{
gin
.
It
(
"should grab all metrics from API server."
,
func
()
{
gin
.
By
(
"Connecting to /metrics endpoint"
)
gin
.
By
(
"Connecting to /metrics endpoint"
)
response
,
err
:=
grabber
.
GrabFromA
pi
Server
()
response
,
err
:=
grabber
.
GrabFromA
PI
Server
()
framework
.
ExpectNoError
(
err
)
framework
.
ExpectNoError
(
err
)
gom
.
Expect
(
response
)
.
NotTo
(
gom
.
BeEmpty
())
gom
.
Expect
(
response
)
.
NotTo
(
gom
.
BeEmpty
())
})
})
...
...
test/e2e/storage/volume_metrics.go
View file @
9e55995a
...
@@ -42,7 +42,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() {
...
@@ -42,7 +42,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() {
c
clientset
.
Interface
c
clientset
.
Interface
ns
string
ns
string
pvc
*
v1
.
PersistentVolumeClaim
pvc
*
v1
.
PersistentVolumeClaim
metricsGrabber
*
metrics
.
Metrics
Grabber
metricsGrabber
*
metrics
.
Grabber
)
)
f
:=
framework
.
NewDefaultFramework
(
"pv"
)
f
:=
framework
.
NewDefaultFramework
(
"pv"
)
...
@@ -422,7 +422,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() {
...
@@ -422,7 +422,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() {
})
})
})
})
func
waitForDetachAndGrabMetrics
(
oldMetrics
map
[
string
]
int64
,
metricsGrabber
*
metrics
.
Metrics
Grabber
)
map
[
string
]
int64
{
func
waitForDetachAndGrabMetrics
(
oldMetrics
map
[
string
]
int64
,
metricsGrabber
*
metrics
.
Grabber
)
map
[
string
]
int64
{
backoff
:=
wait
.
Backoff
{
backoff
:=
wait
.
Backoff
{
Duration
:
10
*
time
.
Second
,
Duration
:
10
*
time
.
Second
,
Factor
:
1.2
,
Factor
:
1.2
,
...
@@ -527,7 +527,7 @@ func findVolumeStatMetric(metricKeyName string, namespace string, pvcName string
...
@@ -527,7 +527,7 @@ func findVolumeStatMetric(metricKeyName string, namespace string, pvcName string
}
}
// Wait for the count of a pv controller's metric specified by metricName and dimension bigger than zero.
// Wait for the count of a pv controller's metric specified by metricName and dimension bigger than zero.
func
waitForPVControllerSync
(
metricsGrabber
*
metrics
.
Metrics
Grabber
,
metricName
,
dimension
string
)
{
func
waitForPVControllerSync
(
metricsGrabber
*
metrics
.
Grabber
,
metricName
,
dimension
string
)
{
backoff
:=
wait
.
Backoff
{
backoff
:=
wait
.
Backoff
{
Duration
:
10
*
time
.
Second
,
Duration
:
10
*
time
.
Second
,
Factor
:
1.2
,
Factor
:
1.2
,
...
@@ -608,7 +608,7 @@ func getStatesMetrics(metricKey string, givenMetrics metrics.Metrics) map[string
...
@@ -608,7 +608,7 @@ func getStatesMetrics(metricKey string, givenMetrics metrics.Metrics) map[string
return
states
return
states
}
}
func
waitForADControllerStatesMetrics
(
metricsGrabber
*
metrics
.
Metrics
Grabber
,
metricName
string
,
dimensions
[]
string
,
stateNames
[]
string
)
{
func
waitForADControllerStatesMetrics
(
metricsGrabber
*
metrics
.
Grabber
,
metricName
string
,
dimensions
[]
string
,
stateNames
[]
string
)
{
backoff
:=
wait
.
Backoff
{
backoff
:=
wait
.
Backoff
{
Duration
:
10
*
time
.
Second
,
Duration
:
10
*
time
.
Second
,
Factor
:
1.2
,
Factor
:
1.2
,
...
...
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