| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build go1.16 && (linux || darwin) |
| // +build go1.16 |
| // +build linux darwin |
| |
| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "time" |
| |
| "github.com/gliderlabs/ssh" |
| "go.opencensus.io/stats" |
| "go.opencensus.io/stats/view" |
| "go.opencensus.io/tag" |
| "golang.org/x/build/internal/coordinator/pool" |
| ) |
| |
| var ( |
| kBuilderType = tag.MustNewKey("go-build/coordinator/keys/builder_type") |
| kGomoteSSHSuccess = tag.MustNewKey("go-build/coordinator/keys/gomote_ssh_success") |
| kHostType = tag.MustNewKey("go-build/coordinator/host_type") |
| mGitHubAPIRemaining = stats.Int64("go-build/githubapi/remaining", "remaining GitHub API rate limit", stats.UnitDimensionless) |
| mGomoteCreateCount = stats.Int64("go-build/coordinator/gomote_create_count", "counter for gomote create invocations", stats.UnitDimensionless) |
| mGomoteRDPCount = stats.Int64("go-build/coordinator/gomote_rdp_count", "counter for gomote RDP invocations", stats.UnitDimensionless) |
| mGomoteSSHCount = stats.Int64("go-build/coordinator/gomote_ssh_count", "counter for gomote SSH invocations", stats.UnitDimensionless) |
| mReverseBuildlets = stats.Int64("go-build/coordinator/reverse_buildlets_count", "number of reverse buildlets", stats.UnitDimensionless) |
| ) |
| |
| // views should contain all measurements. All *view.View added to this |
| // slice will be registered and exported to the metric service. |
| var views = []*view.View{ |
| { |
| Name: "go-build/coordinator/reverse_buildlets_count", |
| Description: "Number of reverse buildlets that are up", |
| Measure: mReverseBuildlets, |
| TagKeys: []tag.Key{kHostType}, |
| Aggregation: view.LastValue(), |
| }, |
| { |
| Name: "go-build/githubapi/remaining", |
| Description: "Remaining GitHub API rate limit", |
| Measure: mGitHubAPIRemaining, |
| Aggregation: view.LastValue(), |
| }, |
| { |
| Name: "go-build/coordinator/gomote_create_count", |
| Description: "Count of gomote create invocations", |
| Measure: mGomoteCreateCount, |
| TagKeys: []tag.Key{kBuilderType}, |
| Aggregation: view.Count(), |
| }, |
| { |
| Name: "go-build/coordinator/gomote_ssh_count", |
| Description: "Count of gomote SSH invocations", |
| Measure: mGomoteSSHCount, |
| TagKeys: []tag.Key{kGomoteSSHSuccess}, |
| Aggregation: view.Count(), |
| }, |
| { |
| Name: "go-build/coordinator/gomote_rdp_count", |
| Description: "Count of gomote RDP ivocations", |
| Measure: mGomoteRDPCount, |
| Aggregation: view.Count(), |
| }, |
| } |
| |
| // reportReverseCountMetrics gathers and reports |
| // a count of running reverse buildlets per type. |
| func reportReverseCountMetrics() { |
| for { |
| // 1. Gather # buildlets up per reverse builder type. |
| totals := pool.ReversePool().HostTypeCount() |
| // 2. Write counts out to the metrics recorder, grouped by hostType. |
| for hostType, n := range totals { |
| stats.RecordWithTags(context.Background(), |
| []tag.Mutator{tag.Upsert(kHostType, hostType)}, |
| mReverseBuildlets.M(int64(n))) |
| } |
| |
| time.Sleep(5 * time.Minute) |
| } |
| } |
| |
| // recordBuildletCreate records information about gomote creates and sends them |
| // to the configured metrics backend. |
| func recordBuildletCreate(ctx context.Context, builderType string) { |
| stats.RecordWithTags(ctx, |
| []tag.Mutator{ |
| tag.Upsert(kBuilderType, builderType), |
| }, |
| mGomoteCreateCount.M(1)) |
| } |
| |
| // recordSSHPublicKeyAuthHandler returns a handler which wraps and ssh public key handler and |
| // records information about gomote SSH usage and sends them to the configured metrics backend. |
| func recordSSHPublicKeyAuthHandler(fn ssh.PublicKeyHandler) ssh.PublicKeyHandler { |
| return func(ctx ssh.Context, key ssh.PublicKey) bool { |
| success := fn(ctx, key) |
| stats.RecordWithTags(ctx, |
| []tag.Mutator{ |
| tag.Upsert(kGomoteSSHSuccess, fmt.Sprintf("%t", success)), |
| }, |
| mGomoteSSHCount.M(1)) |
| return success |
| } |
| } |
| |
| // recordRDPCount records the use of the gomote RDP functionality and sends it |
| // to the configured metrics backend. |
| func recordGomoteRDPUsage(ctx context.Context) { |
| stats.Record(ctx, mGomoteRDPCount.M(1)) |
| } |