mirror of https://github.com/knative/caching.git
Auto-update dependencies (#102)
Produced via: `dep ensure -update knative.dev/test-infra knative.dev/pkg` /assign mattmoor
This commit is contained in:
parent
3f124e23c8
commit
41c23b2a46
|
@ -927,7 +927,7 @@
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:8c823908d13842f7140f59dc246b98d523f436e884ff7c5cd44aae9c3889c890"
|
digest = "1:3c7d420e299c96fab540a977299b43f1606b9d16b0593e7083c84345dcbde5bf"
|
||||||
name = "knative.dev/pkg"
|
name = "knative.dev/pkg"
|
||||||
packages = [
|
packages = [
|
||||||
"apis",
|
"apis",
|
||||||
|
@ -946,18 +946,18 @@
|
||||||
"metrics/metricskey",
|
"metrics/metricskey",
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
pruneopts = "T"
|
||||||
revision = "d8d1bc27181b1a612f7648632b84b9706b57df34"
|
revision = "5cdf30f51ef152232da0e56ef39d35de6c057f3d"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:615f3c6b974179c583edf50234fd87c5731d02ef941f314cbd4dd2766d3a619a"
|
digest = "1:964a4f9e12d5021b9d550e04c36cf23feb880e286ceede1b246d5c0e43b523b9"
|
||||||
name = "knative.dev/test-infra"
|
name = "knative.dev/test-infra"
|
||||||
packages = [
|
packages = [
|
||||||
"scripts",
|
"scripts",
|
||||||
"tools/dep-collector",
|
"tools/dep-collector",
|
||||||
]
|
]
|
||||||
pruneopts = "UT"
|
pruneopts = "UT"
|
||||||
revision = "4adb699576a34afae2e163f0ad5a0d2db0b30a5b"
|
revision = "efad44559f944cfc58dc5bca076eeb3ec20fb346"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
|
|
|
@ -744,10 +744,10 @@
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:bcfc1adc3202f2ff120bc4686c613c8f34af0f9e3de49b55d3bbecd70dc6651b"
|
digest = "1:3b865f5fdc62cc6f52865a3bf29146a384fd5b2f250d8d86c0c2a41a4ffa10c4"
|
||||||
name = "google.golang.org/api"
|
name = "google.golang.org/api"
|
||||||
packages = [
|
packages = [
|
||||||
"container/v1",
|
"container/v1beta1",
|
||||||
"gensupport",
|
"gensupport",
|
||||||
"googleapi",
|
"googleapi",
|
||||||
"googleapi/internal/uritemplates",
|
"googleapi/internal/uritemplates",
|
||||||
|
@ -1313,7 +1313,7 @@
|
||||||
"golang.org/x/oauth2",
|
"golang.org/x/oauth2",
|
||||||
"golang.org/x/oauth2/google",
|
"golang.org/x/oauth2/google",
|
||||||
"golang.org/x/sync/errgroup",
|
"golang.org/x/sync/errgroup",
|
||||||
"google.golang.org/api/container/v1",
|
"google.golang.org/api/container/v1beta1",
|
||||||
"google.golang.org/grpc",
|
"google.golang.org/grpc",
|
||||||
"gopkg.in/yaml.v2",
|
"gopkg.in/yaml.v2",
|
||||||
"k8s.io/api/admission/v1beta1",
|
"k8s.io/api/admission/v1beta1",
|
||||||
|
@ -1369,6 +1369,7 @@
|
||||||
"k8s.io/client-go/testing",
|
"k8s.io/client-go/testing",
|
||||||
"k8s.io/client-go/tools/cache",
|
"k8s.io/client-go/tools/cache",
|
||||||
"k8s.io/client-go/tools/clientcmd",
|
"k8s.io/client-go/tools/clientcmd",
|
||||||
|
"k8s.io/client-go/tools/metrics",
|
||||||
"k8s.io/client-go/tools/record",
|
"k8s.io/client-go/tools/record",
|
||||||
"k8s.io/client-go/util/flowcontrol",
|
"k8s.io/client-go/util/flowcontrol",
|
||||||
"k8s.io/client-go/util/workqueue",
|
"k8s.io/client-go/util/workqueue",
|
||||||
|
|
|
@ -8,7 +8,7 @@ required = [
|
||||||
"k8s.io/code-generator/cmd/client-gen",
|
"k8s.io/code-generator/cmd/client-gen",
|
||||||
"k8s.io/code-generator/cmd/lister-gen",
|
"k8s.io/code-generator/cmd/lister-gen",
|
||||||
"k8s.io/code-generator/cmd/informer-gen",
|
"k8s.io/code-generator/cmd/informer-gen",
|
||||||
"google.golang.org/api/container/v1",
|
"google.golang.org/api/container/v1beta1",
|
||||||
"github.com/evanphx/json-patch",
|
"github.com/evanphx/json-patch",
|
||||||
"knative.dev/test-infra/scripts",
|
"knative.dev/test-infra/scripts",
|
||||||
"knative.dev/test-infra/tools/dep-collector",
|
"knative.dev/test-infra/tools/dep-collector",
|
||||||
|
|
|
@ -25,6 +25,9 @@ import (
|
||||||
"go.opencensus.io/stats/view"
|
"go.opencensus.io/stats/view"
|
||||||
"go.opencensus.io/tag"
|
"go.opencensus.io/tag"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
kubemetrics "k8s.io/client-go/tools/metrics"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
"knative.dev/pkg/metrics"
|
"knative.dev/pkg/metrics"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -48,30 +51,133 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
// Register to receive metrics from kubernetes workqueues.
|
||||||
|
wp := &metrics.WorkqueueProvider{
|
||||||
|
Adds: stats.Int64(
|
||||||
|
"workqueue_adds_total",
|
||||||
|
"Total number of adds handled by workqueue",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
Depth: stats.Int64(
|
||||||
|
"workqueue_depth",
|
||||||
|
"Current depth of workqueue",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
Latency: stats.Float64(
|
||||||
|
"workqueue_queue_latency_seconds",
|
||||||
|
"How long in seconds an item stays in workqueue before being requested.",
|
||||||
|
"s",
|
||||||
|
),
|
||||||
|
Retries: stats.Int64(
|
||||||
|
"workqueue_retries_total",
|
||||||
|
"Total number of retries handled by workqueue",
|
||||||
|
"s",
|
||||||
|
),
|
||||||
|
WorkDuration: stats.Float64(
|
||||||
|
"workqueue_work_duration_seconds",
|
||||||
|
"How long in seconds processing an item from workqueue takes.",
|
||||||
|
"s",
|
||||||
|
),
|
||||||
|
}
|
||||||
|
workqueue.SetProvider(wp)
|
||||||
|
|
||||||
|
// Register to receive metrics from kubernetes reflectors (what powers informers)
|
||||||
|
// NOTE: today these don't actually seem to wire up to anything in Kubernetes.
|
||||||
|
rp := &metrics.ReflectorProvider{
|
||||||
|
ItemsInList: stats.Float64(
|
||||||
|
"reflector_items_in_list",
|
||||||
|
"How many items an API list returns to the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
// TODO(mattmoor): This is not in the latest version, so it will
|
||||||
|
// be removed in a future version.
|
||||||
|
ItemsInMatch: stats.Float64(
|
||||||
|
"reflector_items_in_match",
|
||||||
|
"",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
ItemsInWatch: stats.Float64(
|
||||||
|
"reflector_items_in_watch",
|
||||||
|
"How many items an API watch returns to the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
LastResourceVersion: stats.Float64(
|
||||||
|
"reflector_last_resource_version",
|
||||||
|
"Last resource version seen for the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
ListDuration: stats.Float64(
|
||||||
|
"reflector_list_duration_seconds",
|
||||||
|
"How long an API list takes to return and decode for the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
Lists: stats.Int64(
|
||||||
|
"reflector_lists_total",
|
||||||
|
"Total number of API lists done by the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
ShortWatches: stats.Int64(
|
||||||
|
"reflector_short_watches_total",
|
||||||
|
"Total number of short API watches done by the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
WatchDuration: stats.Float64(
|
||||||
|
"reflector_watch_duration_seconds",
|
||||||
|
"How long an API watch takes to return and decode for the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
Watches: stats.Int64(
|
||||||
|
"reflector_watches_total",
|
||||||
|
"Total number of API watches done by the reflectors",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
cache.SetReflectorMetricsProvider(rp)
|
||||||
|
|
||||||
|
cp := &metrics.ClientProvider{
|
||||||
|
Latency: stats.Float64(
|
||||||
|
"client_latency",
|
||||||
|
"How long Kubernetes API requests take",
|
||||||
|
"s",
|
||||||
|
),
|
||||||
|
Result: stats.Int64(
|
||||||
|
"client_results",
|
||||||
|
"Total number of API requests (broken down by status code)",
|
||||||
|
stats.UnitNone,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
kubemetrics.Register(cp.NewLatencyMetric(), cp.NewResultMetric())
|
||||||
|
|
||||||
|
views := []*view.View{{
|
||||||
|
Description: "Depth of the work queue",
|
||||||
|
Measure: workQueueDepthStat,
|
||||||
|
Aggregation: view.LastValue(),
|
||||||
|
TagKeys: []tag.Key{reconcilerTagKey},
|
||||||
|
}, {
|
||||||
|
Description: "Number of reconcile operations",
|
||||||
|
Measure: reconcileCountStat,
|
||||||
|
Aggregation: view.Count(),
|
||||||
|
TagKeys: []tag.Key{reconcilerTagKey, keyTagKey, successTagKey},
|
||||||
|
}, {
|
||||||
|
Description: "Latency of reconcile operations",
|
||||||
|
Measure: reconcileLatencyStat,
|
||||||
|
Aggregation: reconcileDistribution,
|
||||||
|
TagKeys: []tag.Key{reconcilerTagKey, keyTagKey, successTagKey},
|
||||||
|
}}
|
||||||
|
for _, view := range wp.DefaultViews() {
|
||||||
|
views = append(views, view)
|
||||||
|
}
|
||||||
|
for _, view := range rp.DefaultViews() {
|
||||||
|
views = append(views, view)
|
||||||
|
}
|
||||||
|
for _, view := range cp.DefaultViews() {
|
||||||
|
views = append(views, view)
|
||||||
|
}
|
||||||
|
|
||||||
// Create views to see our measurements. This can return an error if
|
// Create views to see our measurements. This can return an error if
|
||||||
// a previously-registered view has the same name with a different value.
|
// a previously-registered view has the same name with a different value.
|
||||||
// View name defaults to the measure name if unspecified.
|
// View name defaults to the measure name if unspecified.
|
||||||
err := view.Register(
|
if err := view.Register(views...); err != nil {
|
||||||
&view.View{
|
|
||||||
Description: "Depth of the work queue",
|
|
||||||
Measure: workQueueDepthStat,
|
|
||||||
Aggregation: view.LastValue(),
|
|
||||||
TagKeys: []tag.Key{reconcilerTagKey},
|
|
||||||
},
|
|
||||||
&view.View{
|
|
||||||
Description: "Number of reconcile operations",
|
|
||||||
Measure: reconcileCountStat,
|
|
||||||
Aggregation: view.Count(),
|
|
||||||
TagKeys: []tag.Key{reconcilerTagKey, keyTagKey, successTagKey},
|
|
||||||
},
|
|
||||||
&view.View{
|
|
||||||
Description: "Latency of reconcile operations",
|
|
||||||
Measure: reconcileLatencyStat,
|
|
||||||
Aggregation: reconcileDistribution,
|
|
||||||
TagKeys: []tag.Key{reconcilerTagKey, keyTagKey, successTagKey},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 The Knative 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 metrics
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opencensus.io/stats"
|
||||||
|
"go.opencensus.io/stats/view"
|
||||||
|
"k8s.io/client-go/tools/metrics"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ClientProvider implements the pattern of Kubernetes MetricProvider that may
|
||||||
|
// be used to produce suitable metrics for use with metrics.Register()
|
||||||
|
type ClientProvider struct {
|
||||||
|
Latency *stats.Float64Measure
|
||||||
|
Result *stats.Int64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLatencyMetric implements MetricsProvider
|
||||||
|
func (cp *ClientProvider) NewLatencyMetric() metrics.LatencyMetric {
|
||||||
|
return latencyMetric{
|
||||||
|
measure: cp.Latency,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LatencyView returns a view of the Latency metric.
|
||||||
|
func (cp *ClientProvider) LatencyView() *view.View {
|
||||||
|
return measureView(cp.Latency, view.Distribution(BucketsNBy10(0.00001, 8)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewResultMetric implements MetricsProvider
|
||||||
|
func (cp *ClientProvider) NewResultMetric() metrics.ResultMetric {
|
||||||
|
return resultMetric{
|
||||||
|
measure: cp.Result,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResultView returns a view of the Result metric.
|
||||||
|
func (cp *ClientProvider) ResultView() *view.View {
|
||||||
|
return measureView(cp.Result, view.Count())
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultViews returns a list of views suitable for passing to view.Register
|
||||||
|
func (cp *ClientProvider) DefaultViews() []*view.View {
|
||||||
|
return []*view.View{
|
||||||
|
cp.LatencyView(),
|
||||||
|
cp.ResultView(),
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 The Knative 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 metrics
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/url"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.opencensus.io/stats"
|
||||||
|
"go.opencensus.io/stats/view"
|
||||||
|
"go.opencensus.io/tag"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/tools/metrics"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// tagName is used to associate the provided name with each metric created
|
||||||
|
// through the WorkqueueProvider's methods to implement workqueue.MetricsProvider.
|
||||||
|
// For the kubernetes workqueue implementations this is the queue name provided
|
||||||
|
// to the workqueue constructor.
|
||||||
|
tagName = tag.MustNewKey("name")
|
||||||
|
|
||||||
|
// tagVerb is used to associate the verb of the client action with latency metrics.
|
||||||
|
tagVerb = tag.MustNewKey("verb")
|
||||||
|
// tagCode is used to associate the status code the client gets back from an API call.
|
||||||
|
tagCode = tag.MustNewKey("code")
|
||||||
|
// tagMethod is used to associate the HTTP method the client used for the rest call.
|
||||||
|
tagMethod = tag.MustNewKey("method")
|
||||||
|
// tagHost is used to associate the host to which the HTTP request was made.
|
||||||
|
tagHost = tag.MustNewKey("host")
|
||||||
|
// tagPath is used to associate the path to which the HTTP request as made.
|
||||||
|
tagPath = tag.MustNewKey("path")
|
||||||
|
)
|
||||||
|
|
||||||
|
type counterMetric struct {
|
||||||
|
mutators []tag.Mutator
|
||||||
|
measure *stats.Int64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ cache.CounterMetric = (*counterMetric)(nil)
|
||||||
|
_ workqueue.CounterMetric = (*counterMetric)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Inc implements CounterMetric
|
||||||
|
func (m counterMetric) Inc() {
|
||||||
|
Record(context.Background(), m.measure.M(1), stats.WithTags(m.mutators...))
|
||||||
|
}
|
||||||
|
|
||||||
|
type gaugeMetric struct {
|
||||||
|
mutators []tag.Mutator
|
||||||
|
measure *stats.Int64Measure
|
||||||
|
total int64
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ workqueue.GaugeMetric = (*gaugeMetric)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Inc implements CounterMetric
|
||||||
|
func (m *gaugeMetric) Inc() {
|
||||||
|
total := atomic.AddInt64(&m.total, 1)
|
||||||
|
Record(context.Background(), m.measure.M(total), stats.WithTags(m.mutators...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dec implements GaugeMetric
|
||||||
|
func (m *gaugeMetric) Dec() {
|
||||||
|
total := atomic.AddInt64(&m.total, -1)
|
||||||
|
Record(context.Background(), m.measure.M(total), stats.WithTags(m.mutators...))
|
||||||
|
}
|
||||||
|
|
||||||
|
type floatMetric struct {
|
||||||
|
mutators []tag.Mutator
|
||||||
|
measure *stats.Float64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ workqueue.SummaryMetric = (*floatMetric)(nil)
|
||||||
|
_ cache.GaugeMetric = (*floatMetric)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Observe implements SummaryMetric
|
||||||
|
func (m floatMetric) Observe(v float64) {
|
||||||
|
Record(context.Background(), m.measure.M(v), stats.WithTags(m.mutators...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set implements GaugeMetric
|
||||||
|
func (m floatMetric) Set(v float64) {
|
||||||
|
m.Observe(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
type latencyMetric struct {
|
||||||
|
measure *stats.Float64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ metrics.LatencyMetric = (*latencyMetric)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Observe implements LatencyMetric
|
||||||
|
func (m latencyMetric) Observe(verb string, u url.URL, t time.Duration) {
|
||||||
|
Record(context.Background(), m.measure.M(t.Seconds()), stats.WithTags(
|
||||||
|
tag.Insert(tagVerb, verb),
|
||||||
|
tag.Insert(tagHost, u.Host),
|
||||||
|
tag.Insert(tagPath, u.Path),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
type resultMetric struct {
|
||||||
|
measure *stats.Int64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ metrics.ResultMetric = (*resultMetric)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Increment implements ResultMetric
|
||||||
|
func (m resultMetric) Increment(code, method, host string) {
|
||||||
|
Record(context.Background(), m.measure.M(1), stats.WithTags(
|
||||||
|
tag.Insert(tagCode, code),
|
||||||
|
tag.Insert(tagMethod, method),
|
||||||
|
tag.Insert(tagHost, host),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
// measureView returns a view of the supplied metric.
|
||||||
|
func measureView(m stats.Measure, agg *view.Aggregation) *view.View {
|
||||||
|
return &view.View{
|
||||||
|
Name: m.Name(),
|
||||||
|
Description: m.Description(),
|
||||||
|
Measure: m,
|
||||||
|
Aggregation: agg,
|
||||||
|
TagKeys: []tag.Key{tagName},
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,7 +58,7 @@ func CheckCountData(t *testing.T, name string, wantTags map[string]string, wantV
|
||||||
checkRowTags(t, row, name, wantTags)
|
checkRowTags(t, row, name, wantTags)
|
||||||
|
|
||||||
if s, ok := row.Data.(*view.CountData); !ok {
|
if s, ok := row.Data.(*view.CountData); !ok {
|
||||||
t.Errorf("For metric %s: Reporter expected a CountData type", name)
|
t.Errorf("%s: got %T, want CountData", name, row.Data)
|
||||||
} else if s.Value != wantValue {
|
} else if s.Value != wantValue {
|
||||||
t.Errorf("For metric %s: value = %v, want: %d", name, s.Value, wantValue)
|
t.Errorf("For metric %s: value = %v, want: %d", name, s.Value, wantValue)
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ func CheckDistributionData(t *testing.T, name string, wantTags map[string]string
|
||||||
checkRowTags(t, row, name, wantTags)
|
checkRowTags(t, row, name, wantTags)
|
||||||
|
|
||||||
if s, ok := row.Data.(*view.DistributionData); !ok {
|
if s, ok := row.Data.(*view.DistributionData); !ok {
|
||||||
t.Errorf("For metric %s: Reporter expected a DistributionData type", name)
|
t.Errorf("%s: got %T, want DistributionData", name, row.Data)
|
||||||
} else {
|
} else {
|
||||||
if s.Count != expectedCount {
|
if s.Count != expectedCount {
|
||||||
t.Errorf("For metric %s: reporter count = %d, want = %d", name, s.Count, expectedCount)
|
t.Errorf("For metric %s: reporter count = %d, want = %d", name, s.Count, expectedCount)
|
||||||
|
@ -97,7 +97,7 @@ func CheckLastValueData(t *testing.T, name string, wantTags map[string]string, w
|
||||||
checkRowTags(t, row, name, wantTags)
|
checkRowTags(t, row, name, wantTags)
|
||||||
|
|
||||||
if s, ok := row.Data.(*view.LastValueData); !ok {
|
if s, ok := row.Data.(*view.LastValueData); !ok {
|
||||||
t.Errorf("For metric %s: Reporter.Report() expected a LastValueData type", name)
|
t.Errorf("%s: got %T, want LastValueData", name, row.Data)
|
||||||
} else if s.Value != wantValue {
|
} else if s.Value != wantValue {
|
||||||
t.Errorf("For metric %s: Reporter.Report() expected %v got %v", name, s.Value, wantValue)
|
t.Errorf("For metric %s: Reporter.Report() expected %v got %v", name, s.Value, wantValue)
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ func CheckSumData(t *testing.T, name string, wantTags map[string]string, wantVal
|
||||||
checkRowTags(t, row, name, wantTags)
|
checkRowTags(t, row, name, wantTags)
|
||||||
|
|
||||||
if s, ok := row.Data.(*view.SumData); !ok {
|
if s, ok := row.Data.(*view.SumData); !ok {
|
||||||
t.Errorf("For metric %s: Reporter expected a SumData type", name)
|
t.Errorf("%s: got %T, want SumData", name, row.Data)
|
||||||
} else if s.Value != wantValue {
|
} else if s.Value != wantValue {
|
||||||
t.Errorf("For metric %s: value = %v, want: %v", name, s.Value, wantValue)
|
t.Errorf("For metric %s: value = %v, want: %v", name, s.Value, wantValue)
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,18 +37,20 @@ import (
|
||||||
// 3) The backend is Stackdriver and it is allowed to use custom metrics.
|
// 3) The backend is Stackdriver and it is allowed to use custom metrics.
|
||||||
// 4) The backend is Stackdriver and the metric is one of the built-in metrics: "knative_revision", "knative_broker",
|
// 4) The backend is Stackdriver and the metric is one of the built-in metrics: "knative_revision", "knative_broker",
|
||||||
// "knative_trigger", "knative_source".
|
// "knative_trigger", "knative_source".
|
||||||
func Record(ctx context.Context, ms stats.Measurement) {
|
func Record(ctx context.Context, ms stats.Measurement, ros ...stats.Options) {
|
||||||
mc := getCurMetricsConfig()
|
mc := getCurMetricsConfig()
|
||||||
|
|
||||||
|
ros = append(ros, stats.WithMeasurements(ms))
|
||||||
|
|
||||||
// Condition 1)
|
// Condition 1)
|
||||||
if mc == nil {
|
if mc == nil {
|
||||||
stats.Record(ctx, ms)
|
stats.RecordWithOptions(ctx, ros...)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Condition 2) and 3)
|
// Condition 2) and 3)
|
||||||
if !mc.isStackdriverBackend || mc.allowStackdriverCustomMetrics {
|
if !mc.isStackdriverBackend || mc.allowStackdriverCustomMetrics {
|
||||||
stats.Record(ctx, ms)
|
stats.RecordWithOptions(ctx, ros...)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +62,7 @@ func Record(ctx context.Context, ms stats.Measurement) {
|
||||||
metricskey.KnativeSourceMetrics.Has(metricType)
|
metricskey.KnativeSourceMetrics.Has(metricType)
|
||||||
|
|
||||||
if isServingBuiltIn || isEventingBuiltIn {
|
if isServingBuiltIn || isEventingBuiltIn {
|
||||||
stats.Record(ctx, ms)
|
stats.RecordWithOptions(ctx, ros...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,3 +76,13 @@ func Buckets125(low, high float64) []float64 {
|
||||||
}
|
}
|
||||||
return buckets
|
return buckets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BucketsNBy10 generates an array of N buckets starting from low and
|
||||||
|
// multiplying by 10 n times.
|
||||||
|
func BucketsNBy10(low float64, n int) []float64 {
|
||||||
|
buckets := []float64{low}
|
||||||
|
for last, i := low, len(buckets); i < n; last, i = 10*last, i+1 {
|
||||||
|
buckets = append(buckets, 10*last)
|
||||||
|
}
|
||||||
|
return buckets
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 The Knative 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 metrics
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opencensus.io/stats"
|
||||||
|
"go.opencensus.io/stats/view"
|
||||||
|
"go.opencensus.io/tag"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ReflectorProvider implements reflector.MetricsProvider and may be used with
|
||||||
|
// reflector.SetProvider to have metrics exported to the provided metrics.
|
||||||
|
type ReflectorProvider struct {
|
||||||
|
ItemsInList *stats.Float64Measure
|
||||||
|
// TODO(mattmoor): This is not in the latest version, so it will
|
||||||
|
// be removed in a future version.
|
||||||
|
ItemsInMatch *stats.Float64Measure
|
||||||
|
ItemsInWatch *stats.Float64Measure
|
||||||
|
LastResourceVersion *stats.Float64Measure
|
||||||
|
ListDuration *stats.Float64Measure
|
||||||
|
Lists *stats.Int64Measure
|
||||||
|
ShortWatches *stats.Int64Measure
|
||||||
|
WatchDuration *stats.Float64Measure
|
||||||
|
Watches *stats.Int64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ cache.MetricsProvider = (*ReflectorProvider)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewItemsInListMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewItemsInListMetric(name string) cache.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.ItemsInList,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ItemsInListView returns a view of the ItemsInList metric.
|
||||||
|
func (rp *ReflectorProvider) ItemsInListView() *view.View {
|
||||||
|
return measureView(rp.ItemsInList, view.Distribution(BucketsNBy10(0.1, 6)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewItemsInMatchMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewItemsInMatchMetric(name string) cache.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.ItemsInMatch,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ItemsInMatchView returns a view of the ItemsInMatch metric.
|
||||||
|
func (rp *ReflectorProvider) ItemsInMatchView() *view.View {
|
||||||
|
return measureView(rp.ItemsInMatch, view.Distribution(BucketsNBy10(0.1, 6)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewItemsInWatchMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewItemsInWatchMetric(name string) cache.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.ItemsInWatch,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ItemsInWatchView returns a view of the ItemsInWatch metric.
|
||||||
|
func (rp *ReflectorProvider) ItemsInWatchView() *view.View {
|
||||||
|
return measureView(rp.ItemsInWatch, view.Distribution(BucketsNBy10(0.1, 6)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLastResourceVersionMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewLastResourceVersionMetric(name string) cache.GaugeMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.LastResourceVersion,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LastResourceVersionView returns a view of the LastResourceVersion metric.
|
||||||
|
func (rp *ReflectorProvider) LastResourceVersionView() *view.View {
|
||||||
|
return measureView(rp.LastResourceVersion, view.LastValue())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewListDurationMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewListDurationMetric(name string) cache.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.ListDuration,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListDurationView returns a view of the ListDuration metric.
|
||||||
|
func (rp *ReflectorProvider) ListDurationView() *view.View {
|
||||||
|
return measureView(rp.ListDuration, view.Distribution(BucketsNBy10(0.1, 6)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewListsMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewListsMetric(name string) cache.CounterMetric {
|
||||||
|
return counterMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.Lists,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListsView returns a view of the Lists metric.
|
||||||
|
func (rp *ReflectorProvider) ListsView() *view.View {
|
||||||
|
return measureView(rp.Lists, view.Count())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewShortWatchesMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewShortWatchesMetric(name string) cache.CounterMetric {
|
||||||
|
return counterMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.ShortWatches,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShortWatchesView returns a view of the ShortWatches metric.
|
||||||
|
func (rp *ReflectorProvider) ShortWatchesView() *view.View {
|
||||||
|
return measureView(rp.ShortWatches, view.Count())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWatchDurationMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewWatchDurationMetric(name string) cache.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.WatchDuration,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WatchDurationView returns a view of the WatchDuration metric.
|
||||||
|
func (rp *ReflectorProvider) WatchDurationView() *view.View {
|
||||||
|
return measureView(rp.WatchDuration, view.Distribution(BucketsNBy10(0.1, 6)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWatchesMetric implements MetricsProvider
|
||||||
|
func (rp *ReflectorProvider) NewWatchesMetric(name string) cache.CounterMetric {
|
||||||
|
return counterMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: rp.Watches,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WatchesView returns a view of the Watches metric.
|
||||||
|
func (rp *ReflectorProvider) WatchesView() *view.View {
|
||||||
|
return measureView(rp.Watches, view.Count())
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultViews returns a list of views suitable for passing to view.Register
|
||||||
|
func (rp *ReflectorProvider) DefaultViews() []*view.View {
|
||||||
|
return []*view.View{
|
||||||
|
rp.ItemsInListView(),
|
||||||
|
rp.ItemsInMatchView(),
|
||||||
|
rp.ItemsInWatchView(),
|
||||||
|
rp.LastResourceVersionView(),
|
||||||
|
rp.ListDurationView(),
|
||||||
|
rp.ListsView(),
|
||||||
|
rp.ShortWatchesView(),
|
||||||
|
rp.WatchDurationView(),
|
||||||
|
rp.WatchesView(),
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 The Knative 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 metrics
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opencensus.io/stats"
|
||||||
|
"go.opencensus.io/stats/view"
|
||||||
|
"go.opencensus.io/tag"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WorkqueueProvider implements workqueue.MetricsProvider and may be used with
|
||||||
|
// workqueue.SetProvider to have metrics exported to the provided metrics.
|
||||||
|
type WorkqueueProvider struct {
|
||||||
|
Adds *stats.Int64Measure
|
||||||
|
Depth *stats.Int64Measure
|
||||||
|
Latency *stats.Float64Measure
|
||||||
|
Retries *stats.Int64Measure
|
||||||
|
WorkDuration *stats.Float64Measure
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ workqueue.MetricsProvider = (*WorkqueueProvider)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewAddsMetric implements MetricsProvider
|
||||||
|
func (wp *WorkqueueProvider) NewAddsMetric(name string) workqueue.CounterMetric {
|
||||||
|
return counterMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: wp.Adds,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddsView returns a view of the Adds metric.
|
||||||
|
func (wp *WorkqueueProvider) AddsView() *view.View {
|
||||||
|
return measureView(wp.Adds, view.Count())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDepthMetric implements MetricsProvider
|
||||||
|
func (wp *WorkqueueProvider) NewDepthMetric(name string) workqueue.GaugeMetric {
|
||||||
|
return &gaugeMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: wp.Depth,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DepthView returns a view of the Depth metric.
|
||||||
|
func (wp *WorkqueueProvider) DepthView() *view.View {
|
||||||
|
return measureView(wp.Depth, view.LastValue())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLatencyMetric implements MetricsProvider
|
||||||
|
func (wp *WorkqueueProvider) NewLatencyMetric(name string) workqueue.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: wp.Latency,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LatencyView returns a view of the Latency metric.
|
||||||
|
func (wp *WorkqueueProvider) LatencyView() *view.View {
|
||||||
|
return measureView(wp.Latency, view.Distribution(BucketsNBy10(1e-08, 10)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRetriesMetric implements MetricsProvider
|
||||||
|
func (wp *WorkqueueProvider) NewRetriesMetric(name string) workqueue.CounterMetric {
|
||||||
|
return counterMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: wp.Retries,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetriesView returns a view of the Retries metric.
|
||||||
|
func (wp *WorkqueueProvider) RetriesView() *view.View {
|
||||||
|
return measureView(wp.Retries, view.Count())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWorkDurationMetric implements MetricsProvider
|
||||||
|
func (wp *WorkqueueProvider) NewWorkDurationMetric(name string) workqueue.SummaryMetric {
|
||||||
|
return floatMetric{
|
||||||
|
mutators: []tag.Mutator{tag.Insert(tagName, name)},
|
||||||
|
measure: wp.WorkDuration,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WorkDurationView returns a view of the WorkDuration metric.
|
||||||
|
func (wp *WorkqueueProvider) WorkDurationView() *view.View {
|
||||||
|
return measureView(wp.WorkDuration, view.Distribution(BucketsNBy10(1e-08, 10)...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultViews returns a list of views suitable for passing to view.Register
|
||||||
|
func (wp *WorkqueueProvider) DefaultViews() []*view.View {
|
||||||
|
return []*view.View{
|
||||||
|
wp.AddsView(),
|
||||||
|
wp.DepthView(),
|
||||||
|
wp.LatencyView(),
|
||||||
|
wp.RetriesView(),
|
||||||
|
wp.WorkDurationView(),
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,13 +46,11 @@ type GenerateNameReactor struct {
|
||||||
// mocking
|
// mocking
|
||||||
func (r *GenerateNameReactor) Handles(action clientgotesting.Action) bool {
|
func (r *GenerateNameReactor) Handles(action clientgotesting.Action) bool {
|
||||||
create, ok := action.(clientgotesting.CreateAction)
|
create, ok := action.(clientgotesting.CreateAction)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
objMeta, err := meta.Accessor(create.GetObject())
|
objMeta, err := meta.Accessor(create.GetObject())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,16 +18,5 @@ limitations under the License.
|
||||||
Package clustermanager provides support for managing clusters for e2e tests,
|
Package clustermanager provides support for managing clusters for e2e tests,
|
||||||
responsible for creating/deleting cluster, and cluster life cycle management if
|
responsible for creating/deleting cluster, and cluster life cycle management if
|
||||||
running in Prow
|
running in Prow
|
||||||
usage example:
|
|
||||||
func acquireCluster() {
|
|
||||||
clusterOps := GKEClient{}.Setup(2, "n1-standard-8", "us-east1", "a", "myproject")
|
|
||||||
// Cast to GKEOperation
|
|
||||||
GKEOps := clusterOps.(GKECluster)
|
|
||||||
if err = GKEOps.Acquire(); err != nil {
|
|
||||||
log.Fatalf("Failed acquire cluster: '%v'", err)
|
|
||||||
}
|
|
||||||
log.Printf("GKE project is: %s", GKEOps.Project)
|
|
||||||
log.Printf("GKE cluster is: %v", GKEOps.Cluster)
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
package clustermanager
|
package clustermanager
|
||||||
|
|
|
@ -23,12 +23,12 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
container "google.golang.org/api/container/v1beta1"
|
||||||
"knative.dev/pkg/testutils/clustermanager/boskos"
|
"knative.dev/pkg/testutils/clustermanager/boskos"
|
||||||
"knative.dev/pkg/testutils/common"
|
"knative.dev/pkg/testutils/common"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/oauth2/google"
|
"golang.org/x/oauth2/google"
|
||||||
"google.golang.org/api/container/v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -60,6 +60,7 @@ type GKERequest struct {
|
||||||
Region string
|
Region string
|
||||||
Zone string
|
Zone string
|
||||||
BackupRegions []string
|
BackupRegions []string
|
||||||
|
Addons []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// GKECluster implements ClusterOperations
|
// GKECluster implements ClusterOperations
|
||||||
|
@ -114,14 +115,18 @@ func (gsc *GKESDKClient) getOperation(project, location, opName string) (*contai
|
||||||
// nodeType: default to n1-standard-4 if not provided
|
// nodeType: default to n1-standard-4 if not provided
|
||||||
// region: default to regional cluster if not provided, and use default backup regions
|
// region: default to regional cluster if not provided, and use default backup regions
|
||||||
// zone: default is none, must be provided together with region
|
// zone: default is none, must be provided together with region
|
||||||
func (gs *GKEClient) Setup(numNodes *int64, nodeType *string, region *string, zone *string, project *string) ClusterOperations {
|
// project: no default
|
||||||
|
// addons: cluster addons to be added to cluster
|
||||||
|
func (gs *GKEClient) Setup(numNodes *int64, nodeType *string, region *string, zone *string, project *string, addons []string) ClusterOperations {
|
||||||
gc := &GKECluster{
|
gc := &GKECluster{
|
||||||
Request: &GKERequest{
|
Request: &GKERequest{
|
||||||
NumNodes: DefaultGKENumNodes,
|
NumNodes: DefaultGKENumNodes,
|
||||||
NodeType: DefaultGKENodeType,
|
NodeType: DefaultGKENodeType,
|
||||||
Region: DefaultGKERegion,
|
Region: DefaultGKERegion,
|
||||||
Zone: DefaultGKEZone,
|
Zone: DefaultGKEZone,
|
||||||
BackupRegions: DefaultGKEBackupRegions},
|
BackupRegions: DefaultGKEBackupRegions,
|
||||||
|
Addons: addons,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if nil != project { // use provided project and create cluster
|
if nil != project { // use provided project and create cluster
|
||||||
|
@ -236,7 +241,11 @@ func (gc *GKECluster) Acquire() error {
|
||||||
err = nil
|
err = nil
|
||||||
rb := &container.CreateClusterRequest{
|
rb := &container.CreateClusterRequest{
|
||||||
Cluster: &container.Cluster{
|
Cluster: &container.Cluster{
|
||||||
Name: clusterName,
|
Name: clusterName,
|
||||||
|
// Installing addons after cluster creation takes at least 5
|
||||||
|
// minutes, so install addons as part of cluster creation, which
|
||||||
|
// doesn't seem to add much time on top of cluster creation
|
||||||
|
AddonsConfig: gc.getAddonsConfig(),
|
||||||
InitialNodeCount: gc.Request.NumNodes,
|
InitialNodeCount: gc.Request.NumNodes,
|
||||||
NodeConfig: &container.NodeConfig{
|
NodeConfig: &container.NodeConfig{
|
||||||
MachineType: gc.Request.NodeType,
|
MachineType: gc.Request.NodeType,
|
||||||
|
@ -321,6 +330,27 @@ func (gc *GKECluster) Delete() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getAddonsConfig gets AddonsConfig from Request, contains the logic of
|
||||||
|
// converting string argument to typed AddonsConfig, for example `IstioConfig`.
|
||||||
|
// Currently supports istio
|
||||||
|
func (gc *GKECluster) getAddonsConfig() *container.AddonsConfig {
|
||||||
|
const (
|
||||||
|
// Define all supported addons here
|
||||||
|
istio = "istio"
|
||||||
|
)
|
||||||
|
ac := &container.AddonsConfig{}
|
||||||
|
for _, name := range gc.Request.Addons {
|
||||||
|
switch strings.ToLower(name) {
|
||||||
|
case istio:
|
||||||
|
ac.IstioConfig = &container.IstioConfig{Disabled: false}
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("addon type %q not supported. Has to be one of: %q", name, istio))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ac
|
||||||
|
}
|
||||||
|
|
||||||
// wait depends on unique opName(operation ID created by cloud), and waits until
|
// wait depends on unique opName(operation ID created by cloud), and waits until
|
||||||
// it's done
|
// it's done
|
||||||
func (gc *GKECluster) wait(location, opName string, wait time.Duration) error {
|
func (gc *GKECluster) wait(location, opName string, wait time.Duration) error {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright 2019 The Knative Authors
|
# Copyright 2019 The Knative Authors
|
||||||
#
|
#
|
||||||
|
@ -226,7 +226,7 @@ function create_test_cluster() {
|
||||||
local test_wrapper="${kubedir}/e2e-test.sh"
|
local test_wrapper="${kubedir}/e2e-test.sh"
|
||||||
mkdir ${kubedir}/cluster
|
mkdir ${kubedir}/cluster
|
||||||
ln -s "$(which kubectl)" ${kubedir}/cluster/kubectl.sh
|
ln -s "$(which kubectl)" ${kubedir}/cluster/kubectl.sh
|
||||||
echo "#!/bin/bash" > ${test_wrapper}
|
echo "#!/usr/bin/env bash" > ${test_wrapper}
|
||||||
echo "cd $(pwd) && set -x" >> ${test_wrapper}
|
echo "cd $(pwd) && set -x" >> ${test_wrapper}
|
||||||
echo "${E2E_SCRIPT} ${test_cmd_args}" >> ${test_wrapper}
|
echo "${E2E_SCRIPT} ${test_cmd_args}" >> ${test_wrapper}
|
||||||
chmod +x ${test_wrapper}
|
chmod +x ${test_wrapper}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright 2018 The Knative Authors
|
# Copyright 2018 The Knative Authors
|
||||||
#
|
#
|
||||||
|
@ -283,9 +283,9 @@ function acquire_cluster_admin_role() {
|
||||||
local key=$(mktemp)
|
local key=$(mktemp)
|
||||||
echo "Certificate in ${cert}, key in ${key}"
|
echo "Certificate in ${cert}, key in ${key}"
|
||||||
gcloud --format="value(masterAuth.clientCertificate)" \
|
gcloud --format="value(masterAuth.clientCertificate)" \
|
||||||
container clusters describe $2 ${geoflag} | base64 -d > ${cert}
|
container clusters describe $2 ${geoflag} | base64 --decode > ${cert}
|
||||||
gcloud --format="value(masterAuth.clientKey)" \
|
gcloud --format="value(masterAuth.clientKey)" \
|
||||||
container clusters describe $2 ${geoflag} | base64 -d > ${key}
|
container clusters describe $2 ${geoflag} | base64 --decode > ${key}
|
||||||
kubectl config set-credentials cluster-admin \
|
kubectl config set-credentials cluster-admin \
|
||||||
--client-certificate=${cert} --client-key=${key}
|
--client-certificate=${cert} --client-key=${key}
|
||||||
fi
|
fi
|
||||||
|
@ -584,5 +584,5 @@ readonly REPO_NAME_FORMATTED="Knative $(capitalize ${REPO_NAME//-/ })"
|
||||||
|
|
||||||
# Public latest nightly or release yaml files.
|
# Public latest nightly or release yaml files.
|
||||||
readonly KNATIVE_SERVING_RELEASE="$(get_latest_knative_yaml_source "serving" "serving")"
|
readonly KNATIVE_SERVING_RELEASE="$(get_latest_knative_yaml_source "serving" "serving")"
|
||||||
readonly KNATIVE_BUILD_RELEASE="$(get_latest_knative_yaml_source "build" "build")"
|
|
||||||
readonly KNATIVE_EVENTING_RELEASE="$(get_latest_knative_yaml_source "eventing" "release")"
|
readonly KNATIVE_EVENTING_RELEASE="$(get_latest_knative_yaml_source "eventing" "release")"
|
||||||
|
readonly KNATIVE_MONITORING_RELEASE="$(get_latest_knative_yaml_source "serving" "monitoring")"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright 2018 The Knative Authors
|
# Copyright 2018 The Knative Authors
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright 2018 The Knative Authors
|
# Copyright 2018 The Knative Authors
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue