@@ -638,207 +638,6 @@ func TestAddDistribution(t *testing.T) {
638
638
639
639
}
640
640
641
- func TestMapToIndexPositiveScale (t * testing.T ) {
642
- tests := []struct {
643
- name string
644
- scale int
645
- values []float64
646
- expected []int
647
- }{
648
- {
649
- name : "positive value inside bucket" ,
650
- scale : 1 ,
651
- values : []float64 {1.3 , 1.5 , 2.2 , 3.9 , 4.2 , 6.0 },
652
- expected : []int {0 , 1 , 2 , 3 , 4 , 5 },
653
- },
654
- {
655
- // for positive values, histogram buckets use upper-inclusive boundaries
656
- // this is only reliable on boundaries that are powers of 2
657
- name : "positive value is on boundary" ,
658
- scale : 1 ,
659
- values : []float64 {2.0 , 4.0 , 8.0 },
660
- expected : []int {1 , 3 , 5 },
661
- },
662
- {
663
- name : "negative value inside bucket" ,
664
- scale : 1 ,
665
- values : []float64 {- 1.3 , - 1.5 , - 2.2 , - 3.9 , - 4.2 , - 6.0 },
666
- expected : []int {0 , 1 , 2 , 3 , 4 , 5 },
667
- },
668
- {
669
- // for negative values, histogram buckets use lower-inclusive boundaries
670
- // this is only reliable on boundaries that are powers of 2
671
- name : "negative value is on boundary" ,
672
- scale : 1 ,
673
- values : []float64 {- 1.0 , - 2.0 , - 4.0 },
674
- expected : []int {0 , 2 , 4 },
675
- },
676
- }
677
- for _ , tt := range tests {
678
- t .Run (tt .name , func (t * testing.T ) {
679
- for i , value := range tt .values {
680
- assert .Equal (t , tt .expected [i ], MapToIndex (value , tt .scale ), "expected value %f to map to index %d with scale %d" , value , tt .expected [i ], tt .scale )
681
- }
682
- })
683
- }
684
-
685
- }
686
-
687
- func TestMapToIndexScale0 (t * testing.T ) {
688
- tests := []struct {
689
- name string
690
- values []float64
691
- expected []int
692
- }{
693
- {
694
- name : "positive value inside bucket" ,
695
- values : []float64 {1.5 , 3.0 , 6 , 12 , 18 },
696
- expected : []int {0 , 1 , 2 , 3 , 4 },
697
- },
698
- {
699
- // for negative values, histogram buckets use lower-inclusive boundaries
700
- name : "positive value is on boundary" ,
701
- values : []float64 {2 , 4 , 8 , 16.0 , 32 },
702
- expected : []int {0 , 1 , 2 , 3 , 4 },
703
- },
704
- {
705
- name : "negative value inside bucket" ,
706
- values : []float64 {- 1.5 , - 3.0 , - 6 , - 12 , - 18 },
707
- expected : []int {0 , 1 , 2 , 3 , 4 },
708
- },
709
- {
710
- // for negative values, histogram buckets use lower-inclusive boundaries
711
- name : "negative value is on boundary" ,
712
- values : []float64 {- 2 , - 4 , - 8 , - 16 , - 32 },
713
- expected : []int {1 , 2 , 3 , 4 , 5 },
714
- },
715
- }
716
- for _ , tt := range tests {
717
- t .Run (tt .name , func (t * testing.T ) {
718
- for i , value := range tt .values {
719
- assert .Equal (t , tt .expected [i ], MapToIndexNegativeScale (value , 0 ), "expected value %f to map to index %d with scale 0" , value , tt .expected [i ])
720
- }
721
- })
722
- }
723
- }
724
-
725
- func TestMapToIndexNegativeScale (t * testing.T ) {
726
- tests := []struct {
727
- name string
728
- scale int
729
- values []float64
730
- expected []int
731
- }{
732
- {
733
- name : "positive value inside bucket" ,
734
- scale : - 1 ,
735
- values : []float64 {1.5 , 5.0 , 32 , 80 , 500 , 2000 },
736
- expected : []int {0 , 1 , 2 , 3 , 4 , 5 },
737
- },
738
- {
739
- // for positive values, histogram buckets use upper-inclusive boundaries
740
- name : "positive value is on boundary" ,
741
- scale : - 1 ,
742
- values : []float64 {4 , 16 , 64 , 256 , 1024 },
743
- expected : []int {0 , 1 , 2 , 3 , 4 , 5 },
744
- },
745
- {
746
- name : "negative value inside bucket" ,
747
- scale : - 1 ,
748
- values : []float64 {- 1.5 , - 5.0 , - 32 , - 80 , - 500 , - 2000 },
749
- expected : []int {0 , 1 , 2 , 3 , 4 , 5 },
750
- },
751
- {
752
- // for negative values, histogram buckets use lower-inclusive boundaries
753
- name : "negative value is on boundary" ,
754
- scale : - 1 ,
755
- values : []float64 {- 1 , - 4 , - 16 , - 64 , - 256 , - 1024 },
756
- expected : []int {0 , 1 , 2 , 3 , 4 , 5 , 6 },
757
- },
758
- }
759
- for _ , tt := range tests {
760
- t .Run (tt .name , func (t * testing.T ) {
761
- for i , value := range tt .values {
762
- assert .Equal (t , tt .expected [i ], MapToIndexNegativeScale (value , tt .scale ), "expected value %f to map to index %d with scale %d" , value , tt .expected [i ], tt .scale )
763
- }
764
- })
765
- }
766
- }
767
-
768
- func TestLowerBoundary (t * testing.T ) {
769
- // scale = 1, base = 2^(1/2) or sqrt(2) = 1.41421
770
- assert .InDelta (t , 1.41421 , LowerBoundary (1 , 1 ), 0.01 ) // 2^(1/2)
771
- assert .InDelta (t , 2.0 , LowerBoundary (2 , 1 ), 0.01 ) // 2^(2/2)
772
- assert .InDelta (t , 2.82842 , LowerBoundary (3 , 1 ), 0.01 ) // 2^(3/2)
773
- assert .InDelta (t , 4.0 , LowerBoundary (4 , 1 ), 0.01 ) // 2^(4/2)
774
- assert .InDelta (t , 8.0 , LowerBoundary (6 , 1 ), 0.01 ) // 2^(6/2)
775
- assert .InDelta (t , 16.0 , LowerBoundary (8 , 1 ), 0.01 ) // 2^(8/2)
776
-
777
- // scale = 2, base = 2^(1/4) = 1.18921
778
- assert .InDelta (t , 1.18921 , LowerBoundary (1 , 2 ), 0.01 ) // 2^(1/4)
779
- assert .InDelta (t , 1.41421 , LowerBoundary (2 , 2 ), 0.01 ) // 2^(2/4)
780
- assert .InDelta (t , 1.68180 , LowerBoundary (3 , 2 ), 0.01 ) // 2^(3/4)
781
- assert .InDelta (t , 2.0 , LowerBoundary (4 , 2 ), 0.01 ) // 2^(4/4)
782
- assert .InDelta (t , 2.82842 , LowerBoundary (6 , 2 ), 0.01 ) // 2^(6/8)
783
- assert .InDelta (t , 4.0 , LowerBoundary (8 , 2 ), 0.01 ) // 2^(8/8)
784
-
785
- // scale = 0, base = 2
786
- assert .Equal (t , 1.0 , LowerBoundary (0 , 0 )) // 2^0
787
- assert .Equal (t , 2.0 , LowerBoundary (1 , 0 )) // 2^1
788
- assert .Equal (t , 4.0 , LowerBoundary (2 , 0 )) // 2^2
789
- assert .Equal (t , 8.0 , LowerBoundary (3 , 0 )) // 2^3
790
-
791
- assert .Equal (t , 1.0 , LowerBoundary (0 , - 1 )) // 4^0
792
- assert .Equal (t , 4.0 , LowerBoundary (1 , - 1 )) // 4^1
793
- assert .Equal (t , 16.0 , LowerBoundary (2 , - 1 )) // 4^2
794
- assert .Equal (t , 64.0 , LowerBoundary (3 , - 1 )) // 4^3
795
-
796
- // scale = -2, base = 2^(2^2) = 2^4 = 16
797
- assert .Equal (t , 1.0 , LowerBoundary (0 , - 2 )) // 16^0
798
- assert .Equal (t , 16.0 , LowerBoundary (1 , - 2 )) // 16^1
799
- assert .Equal (t , 256.0 , LowerBoundary (2 , - 2 )) // 16^2
800
- assert .Equal (t , 4096.0 , LowerBoundary (3 , - 2 )) // 16^3
801
-
802
- assert .Equal (t , 1.0 , LowerBoundary (0 , - 1 )) // 4^0
803
- assert .Equal (t , 4.0 , LowerBoundary (1 , - 1 )) // 2^(2^1)^1 = 4^1 = 2^2 = 4^1
804
- assert .Equal (t , 16.0 , LowerBoundary (2 , - 1 )) // (2^2^1)^2 = 4^2 = 2^4 = 4^2
805
- assert .Equal (t , 64.0 , LowerBoundary (3 , - 1 )) // (2^2^1)^3 = 4^3 = 2^6 = 4^3
806
-
807
- // scale = -2, base = 2^(2^2) = 2^4 = 16
808
- assert .Equal (t , 1.0 , LowerBoundary (0 , - 2 )) // (2^(2^2))^0 = 16^0 = 1
809
- assert .Equal (t , 16.0 , LowerBoundary (1 , - 2 )) // (2^(2^2))^1 = 2^4 = 16^1
810
- assert .Equal (t , 256.0 , LowerBoundary (2 , - 2 )) // (2^(2^2))^2 = 2^8 = 16^2
811
- assert .Equal (t , 4096.0 , LowerBoundary (3 , - 2 )) // (2^(2^2))^3 = 2^12 = 16^3
812
- }
813
-
814
- func BenchmarkLowerBoundary (b * testing.B ) {
815
- b .Run ("positive scale" , func (b * testing.B ) {
816
- for i := 0 ; i < b .N ; i ++ {
817
- LowerBoundary (10 , 1 )
818
- }
819
- })
820
-
821
- b .Run ("scale 0" , func (b * testing.B ) {
822
- for i := 0 ; i < b .N ; i ++ {
823
- LowerBoundary (10 , 0 )
824
- }
825
- })
826
-
827
- b .Run ("negative scale" , func (b * testing.B ) {
828
- for i := 0 ; i < b .N ; i ++ {
829
- LowerBoundary (10 , - 1 )
830
- }
831
- })
832
- }
833
-
834
- func BenchmarkLowerBoundaryNegativeScale (b * testing.B ) {
835
- b .Run ("reference" , func (b * testing.B ) {
836
- for i := 0 ; i < b .N ; i ++ {
837
- LowerBoundaryNegativeScale (10 , - 9 )
838
- }
839
- })
840
- }
841
-
842
641
func BenchmarkConvertFromOtel (b * testing.B ) {
843
642
844
643
ts := time .Date (2025 , time .March , 31 , 22 , 6 , 30 , 0 , time .UTC )
0 commit comments