agones.dev/agones@v1.54.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  }