@@ -500,6 +500,88 @@ func TestAgentStats(t *testing.T) {
500
500
assert .EqualValues (t , golden , collected )
501
501
}
502
502
503
+ func TestExperimentsMetric (t * testing.T ) {
504
+ t .Parallel ()
505
+
506
+ tests := []struct {
507
+ name string
508
+ experiments codersdk.Experiments
509
+ expected map [codersdk.Experiment ]float64
510
+ }{
511
+ {
512
+ name : "Enabled experiment is exported in metrics" ,
513
+ experiments : codersdk.Experiments {codersdk .ExperimentSharedPorts },
514
+ expected : map [codersdk.Experiment ]float64 {
515
+ codersdk .ExperimentSharedPorts : 1 ,
516
+ },
517
+ },
518
+ {
519
+ name : "Disabled experiment is exported in metrics" ,
520
+ experiments : codersdk.Experiments {},
521
+ expected : map [codersdk.Experiment ]float64 {
522
+ codersdk .ExperimentSharedPorts : 0 ,
523
+ },
524
+ },
525
+ {
526
+ name : "Unknown experiment is not exported in metrics" ,
527
+ experiments : codersdk.Experiments {codersdk .Experiment ("bob" )},
528
+ expected : map [codersdk.Experiment ]float64 {},
529
+ },
530
+ }
531
+
532
+ for _ , tc := range tests {
533
+ tc := tc
534
+
535
+ t .Run (tc .name , func (t * testing.T ) {
536
+ t .Parallel ()
537
+ reg := prometheus .NewRegistry ()
538
+
539
+ require .NoError (t , prometheusmetrics .Experiments (reg , tc .experiments ))
540
+
541
+ out , err := reg .Gather ()
542
+ require .NoError (t , err )
543
+ require .Lenf (t , out , 1 , "unexpected number of registered metrics" )
544
+
545
+ seen := make (map [codersdk.Experiment ]float64 )
546
+
547
+ for _ , metric := range out [0 ].GetMetric () {
548
+ require .Equal (t , "coderd_experiments" , out [0 ].GetName ())
549
+
550
+ labels := metric .GetLabel ()
551
+ require .Lenf (t , labels , 1 , "unexpected number of labels" )
552
+
553
+ experiment := codersdk .Experiment (labels [0 ].GetValue ())
554
+ value := metric .GetGauge ().GetValue ()
555
+
556
+ seen [experiment ] = value
557
+
558
+ expectedValue := 0
559
+
560
+ // Find experiment we expect to be enabled.
561
+ for _ , exp := range tc .experiments {
562
+ if experiment == exp {
563
+ expectedValue = 1
564
+ break
565
+ }
566
+ }
567
+
568
+ require .EqualValuesf (t , expectedValue , value , "expected %d value for experiment %q" , expectedValue , experiment )
569
+ }
570
+
571
+ // We don't want to define the state of all experiments because codersdk.ExperimentAll will change at some
572
+ // point and break these tests; so we only validate the experiments we know about.
573
+ for exp , val := range seen {
574
+ expectedVal , found := tc .expected [exp ]
575
+ if ! found {
576
+ t .Logf ("ignoring experiment %q; it is not listed in expectations" , exp )
577
+ continue
578
+ }
579
+ require .Equalf (t , expectedVal , val , "experiment %q did not match expected value %v" , exp , expectedVal )
580
+ }
581
+ })
582
+ }
583
+ }
584
+
503
585
func prepareWorkspaceAndAgent (t * testing.T , client * codersdk.Client , user codersdk.CreateFirstUserResponse , workspaceNum int ) * agentsdk.Client {
504
586
authToken := uuid .NewString ()
505
587
0 commit comments