...

Source file src/google.golang.org/grpc/orca/server_metrics_test.go

Documentation: google.golang.org/grpc/orca

     1  /*
     2   *
     3   * Copyright 2023 gRPC authors.
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   */
    18  
    19  package orca
    20  
    21  import (
    22  	"testing"
    23  
    24  	"github.com/google/go-cmp/cmp"
    25  	"google.golang.org/grpc/internal/grpctest"
    26  )
    27  
    28  type s struct {
    29  	grpctest.Tester
    30  }
    31  
    32  func Test(t *testing.T) {
    33  	grpctest.RunSubTests(t, s{})
    34  }
    35  
    36  func (s) TestServerMetrics_Setters(t *testing.T) {
    37  	smr := NewServerMetricsRecorder()
    38  
    39  	smr.SetCPUUtilization(0.1)
    40  	smr.SetMemoryUtilization(0.2)
    41  	smr.SetApplicationUtilization(0.3)
    42  	smr.SetQPS(0.4)
    43  	smr.SetEPS(0.5)
    44  	smr.SetNamedUtilization("x", 0.6)
    45  
    46  	want := &ServerMetrics{
    47  		CPUUtilization: 0.1,
    48  		MemUtilization: 0.2,
    49  		AppUtilization: 0.3,
    50  		QPS:            0.4,
    51  		EPS:            0.5,
    52  		Utilization:    map[string]float64{"x": 0.6},
    53  		NamedMetrics:   map[string]float64{},
    54  		RequestCost:    map[string]float64{},
    55  	}
    56  
    57  	got := smr.ServerMetrics()
    58  	if d := cmp.Diff(got, want); d != "" {
    59  		t.Fatalf("unexpected server metrics: -got +want: %v", d)
    60  	}
    61  }
    62  
    63  func (s) TestServerMetrics_Deleters(t *testing.T) {
    64  	smr := NewServerMetricsRecorder()
    65  
    66  	smr.SetCPUUtilization(0.1)
    67  	smr.SetMemoryUtilization(0.2)
    68  	smr.SetApplicationUtilization(0.3)
    69  	smr.SetQPS(0.4)
    70  	smr.SetEPS(0.5)
    71  	smr.SetNamedUtilization("x", 0.6)
    72  	smr.SetNamedUtilization("y", 0.7)
    73  
    74  	// Now delete everything except named_utilization "y".
    75  	smr.DeleteCPUUtilization()
    76  	smr.DeleteMemoryUtilization()
    77  	smr.DeleteApplicationUtilization()
    78  	smr.DeleteQPS()
    79  	smr.DeleteEPS()
    80  	smr.DeleteNamedUtilization("x")
    81  
    82  	want := &ServerMetrics{
    83  		CPUUtilization: -1,
    84  		MemUtilization: -1,
    85  		AppUtilization: -1,
    86  		QPS:            -1,
    87  		EPS:            -1,
    88  		Utilization:    map[string]float64{"y": 0.7},
    89  		NamedMetrics:   map[string]float64{},
    90  		RequestCost:    map[string]float64{},
    91  	}
    92  
    93  	got := smr.ServerMetrics()
    94  	if d := cmp.Diff(got, want); d != "" {
    95  		t.Fatalf("unexpected server metrics: -got +want: %v", d)
    96  	}
    97  }
    98  
    99  func (s) TestServerMetrics_Setters_Range(t *testing.T) {
   100  	smr := NewServerMetricsRecorder()
   101  
   102  	smr.SetCPUUtilization(0.1)
   103  	smr.SetMemoryUtilization(0.2)
   104  	smr.SetApplicationUtilization(0.3)
   105  	smr.SetQPS(0.4)
   106  	smr.SetEPS(0.5)
   107  	smr.SetNamedUtilization("x", 0.6)
   108  
   109  	// Negatives for all these fields should be ignored.
   110  	smr.SetCPUUtilization(-2)
   111  	smr.SetMemoryUtilization(-3)
   112  	smr.SetApplicationUtilization(-4)
   113  	smr.SetQPS(-0.1)
   114  	smr.SetEPS(-0.6)
   115  	smr.SetNamedUtilization("x", -2)
   116  
   117  	// Memory and named utilizations over 1 are ignored.
   118  	smr.SetMemoryUtilization(1.1)
   119  	smr.SetNamedUtilization("x", 1.1)
   120  
   121  	want := &ServerMetrics{
   122  		CPUUtilization: 0.1,
   123  		MemUtilization: 0.2,
   124  		AppUtilization: 0.3,
   125  		QPS:            0.4,
   126  		EPS:            0.5,
   127  		Utilization:    map[string]float64{"x": 0.6},
   128  		NamedMetrics:   map[string]float64{},
   129  		RequestCost:    map[string]float64{},
   130  	}
   131  
   132  	got := smr.ServerMetrics()
   133  	if d := cmp.Diff(got, want); d != "" {
   134  		t.Fatalf("unexpected server metrics: -got +want: %v", d)
   135  	}
   136  }
   137  
   138  func (s) TestServerMetrics_Merge(t *testing.T) {
   139  	sm1 := &ServerMetrics{
   140  		CPUUtilization: 0.1,
   141  		MemUtilization: 0.2,
   142  		AppUtilization: 0.3,
   143  		QPS:            -1,
   144  		EPS:            0,
   145  		Utilization:    map[string]float64{"x": 0.6},
   146  		NamedMetrics:   map[string]float64{"y": 0.2},
   147  		RequestCost:    map[string]float64{"a": 0.1},
   148  	}
   149  
   150  	sm2 := &ServerMetrics{
   151  		CPUUtilization: -1,
   152  		AppUtilization: 0,
   153  		QPS:            0.9,
   154  		EPS:            20,
   155  		Utilization:    map[string]float64{"x": 0.5, "y": 0.4},
   156  		NamedMetrics:   map[string]float64{"x": 0.1},
   157  		RequestCost:    map[string]float64{"a": 0.2},
   158  	}
   159  
   160  	want := &ServerMetrics{
   161  		CPUUtilization: 0.1,
   162  		MemUtilization: 0,
   163  		AppUtilization: 0,
   164  		QPS:            0.9,
   165  		EPS:            20,
   166  		Utilization:    map[string]float64{"x": 0.5, "y": 0.4},
   167  		NamedMetrics:   map[string]float64{"x": 0.1, "y": 0.2},
   168  		RequestCost:    map[string]float64{"a": 0.2},
   169  	}
   170  
   171  	sm1.merge(sm2)
   172  	if d := cmp.Diff(sm1, want); d != "" {
   173  		t.Fatalf("unexpected server metrics: -got +want: %v", d)
   174  	}
   175  }
   176  

View as plain text