...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/reaper/metric_test.go

Documentation: github.com/cybertec-postgresql/pgwatch/v3/internal/reaper

     1  package reaper
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
     8  	"github.com/cybertec-postgresql/pgwatch/v3/internal/sources"
     9  	"github.com/pashagolub/pgxmock/v4"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  var (
    14  	initialMetricDefs = metrics.MetricDefs{
    15  		"metric1": metrics.Metric{Description: "metric1"},
    16  	}
    17  	initialPresetDefs = metrics.PresetDefs{
    18  		"preset1": metrics.Preset{Description: "preset1", Metrics: map[string]float64{"metric1": 1.0}},
    19  	}
    20  
    21  	newMetricDefs = metrics.MetricDefs{
    22  		"metric2": metrics.Metric{Description: "metric2"},
    23  	}
    24  	newPresetDefs = metrics.PresetDefs{
    25  		"preset2": metrics.Preset{Description: "preset2", Metrics: map[string]float64{"metric2": 2.0}},
    26  	}
    27  )
    28  
    29  func TestReaper_FetchStatsDirectlyFromOS(t *testing.T) {
    30  	a := assert.New(t)
    31  	r := &Reaper{}
    32  	conn, _ := pgxmock.NewPool(pgxmock.QueryMatcherOption(pgxmock.QueryMatcherEqual))
    33  	expq := conn.ExpectQuery("SELECT COALESCE(inet_client_addr(), inet_server_addr()) IS NULL")
    34  	expq.Times(uint(len(directlyFetchableOSMetrics)))
    35  	md := &sources.SourceConn{Conn: conn}
    36  	for _, m := range directlyFetchableOSMetrics {
    37  		expq.WillReturnRows(pgxmock.NewRows([]string{"is_unix_socket"}).AddRow(true))
    38  		a.True(IsDirectlyFetchableMetric(md, m), "Expected %s to be directly fetchable", m)
    39  		a.NotPanics(func() {
    40  			_, _ = r.FetchStatsDirectlyFromOS(context.Background(), md, m)
    41  		})
    42  	}
    43  }
    44  
    45  func TestConcurrentMetricDefs_Assign(t *testing.T) {
    46  	concurrentDefs := NewConcurrentMetricDefs()
    47  	concurrentDefs.Assign(&metrics.Metrics{
    48  		MetricDefs: initialMetricDefs,
    49  		PresetDefs: initialPresetDefs,
    50  	})
    51  
    52  	concurrentDefs.Assign(&metrics.Metrics{
    53  		MetricDefs: newMetricDefs,
    54  		PresetDefs: newPresetDefs,
    55  	})
    56  
    57  	assert.Equal(t, newMetricDefs, concurrentDefs.MetricDefs, "MetricDefs should be updated")
    58  	assert.Equal(t, newPresetDefs, concurrentDefs.PresetDefs, "PresetDefs should be updated")
    59  }
    60  
    61  func TestConcurrentMetricDefs_RandomAccess(t *testing.T) {
    62  	a := assert.New(t)
    63  
    64  	concurrentDefs := NewConcurrentMetricDefs()
    65  	concurrentDefs.Assign(&metrics.Metrics{
    66  		MetricDefs: initialMetricDefs,
    67  		PresetDefs: initialPresetDefs,
    68  	})
    69  
    70  	go a.NotPanics(func() {
    71  		for range 1000 {
    72  			_, ok1 := concurrentDefs.GetMetricDef("metric1")
    73  			_, ok2 := concurrentDefs.GetMetricDef("metric2")
    74  			a.True(ok1 || ok2, "Expected metric1 or metric3 to exist at any time")
    75  			_, ok1 = concurrentDefs.GetPresetDef("preset1")
    76  			_, ok2 = concurrentDefs.GetPresetDef("preset2")
    77  			a.True(ok1 || ok2, "Expected preset1 or preset2 to exist at any time")
    78  			m1 := concurrentDefs.GetPresetMetrics("preset1")
    79  			m2 := concurrentDefs.GetPresetMetrics("preset2")
    80  			a.True(m1 != nil || m2 != nil, "Expected preset1 or preset2 metrics to be non-empty")
    81  		}
    82  	})
    83  
    84  	go a.NotPanics(func() {
    85  		for range 1000 {
    86  			concurrentDefs.Assign(&metrics.Metrics{
    87  				MetricDefs: newMetricDefs,
    88  				PresetDefs: newPresetDefs,
    89  			})
    90  		}
    91  	})
    92  }
    93