agones.dev/agones@v1.53.0/pkg/gameserversets/metrics.go (about) 1 // Copyright 2024 Google LLC All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package gameserversets 16 17 import ( 18 "context" 19 "fmt" 20 "time" 21 22 listerv1 "agones.dev/agones/pkg/client/listers/agones/v1" 23 mt "agones.dev/agones/pkg/metrics" 24 "agones.dev/agones/pkg/util/runtime" 25 "github.com/sirupsen/logrus" 26 "go.opencensus.io/stats" 27 "go.opencensus.io/stats/view" 28 "go.opencensus.io/tag" 29 ) 30 31 var ( 32 logger = runtime.NewLoggerWithSource("metrics") 33 34 keyName = mt.MustTagKey("name") 35 keyNamespace = mt.MustTagKey("namespace") 36 keyFleetName = mt.MustTagKey("fleet_name") 37 keyType = mt.MustTagKey("type") 38 39 gameServerCreationDuration = stats.Float64("gameserver_creation/duration", "The duration of gameserver creation", "s") 40 41 stateViews = []*view.View{ 42 { 43 Name: "gameserver_creation_duration", 44 Measure: gameServerCreationDuration, 45 Description: "The time gameserver takes to be created in seconds", 46 Aggregation: view.Distribution(0, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2, 3), 47 TagKeys: []tag.Key{keyName, keyType, keyFleetName, keyNamespace}, 48 }, 49 } 50 ) 51 52 // register all our state views to OpenCensus 53 func registerViews() { 54 for _, v := range stateViews { 55 if err := view.Register(v); err != nil { 56 logger.WithError(err).Error("could not register view") 57 } 58 } 59 } 60 61 // unregister views, this is only useful for tests as it trigger reporting. 62 func unRegisterViews() { 63 for _, v := range stateViews { 64 view.Unregister(v) 65 } 66 } 67 68 // default set of tags for latency metric 69 var latencyTags = []tag.Mutator{ 70 tag.Insert(keyName, "none"), 71 tag.Insert(keyFleetName, "none"), 72 tag.Insert(keyType, "none"), 73 } 74 75 type metrics struct { 76 ctx context.Context 77 gameServerLister listerv1.GameServerLister 78 logger *logrus.Entry 79 start time.Time 80 } 81 82 // record the current current gameserver creation latency 83 func (r *metrics) record() { 84 stats.Record(r.ctx, gameServerCreationDuration.M(time.Since(r.start).Seconds())) 85 } 86 87 // mutate the current set of metric tags 88 func (r *metrics) mutate(m ...tag.Mutator) { 89 var err error 90 r.ctx, err = tag.New(r.ctx, m...) 91 if err != nil { 92 r.logger.WithError(err).Warn("failed to mutate request context.") 93 } 94 } 95 96 // setError set the latency status tag as error. 97 func (r *metrics) setError(errorType string) { 98 r.mutate(tag.Update(keyType, errorType)) 99 } 100 101 // setRequest set request metric tags. 102 func (r *metrics) setRequest(count int) { 103 r.mutate(tag.Update(keyName, fmt.Sprint(count))) 104 }