ROOTPLOIT
Server: LiteSpeed
System: Linux in-mum-web1878.main-hosting.eu 5.14.0-570.21.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 11 07:22:35 EDT 2025 x86_64
User: u435929562 (435929562)
PHP: 7.4.33
Disabled: system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
Upload Files
File: //opt/go/pkg/mod/github.com/prometheus/[email protected]/model/value_histogram_test.go
// Copyright 2013 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package model

import (
	"encoding/json"
	"reflect"
	"regexp"
	"testing"

	"github.com/stretchr/testify/require"
)

var (
	noWhitespace = regexp.MustCompile(`\s`)

	sampleHistogramPairMatrixPlain = `[
		{
			"metric":{
				"__name__":"test_metric"
			},
			"histograms":[
				[
					1234.567,
					{
					"count":"6",
					"sum":"3897",
					"buckets":[
						[
							1,
							"-4870.992343051145",
							"-4466.7196729968955",
							"1"
						],
						[
							1,
							"-861.0779292198035",
							"-789.6119426088657",
							"1"
						],
						[
							1,
							"-558.3399591246119",
							"-512",
							"1"
						],
						[
							0,
							"2048",
							"2233.3598364984477",
							"1"
						],
						[
							0,
							"2896.3093757400984",
							"3158.4477704354626",
							"1"
						],
						[
							0,
							"4466.7196729968955",
							"4870.992343051145",
							"1"
						]
					]
					}
				],
				[
					12345.678,
					{
					"count":"6",
					"sum":"3897",
					"buckets":[
						[
							1,
							"-4870.992343051145",
							"-4466.7196729968955",
							"1"
						],
						[
							1,
							"-861.0779292198035",
							"-789.6119426088657",
							"1"
						],
						[
							1,
							"-558.3399591246119",
							"-512",
							"1"
						],
						[
							0,
							"2048",
							"2233.3598364984477",
							"1"
						],
						[
							0,
							"2896.3093757400984",
							"3158.4477704354626",
							"1"
						],
						[
							0,
							"4466.7196729968955",
							"4870.992343051145",
							"1"
						]
					]
					}
				]
			]
		},
		{
			"metric":{
				"foo":"bar"
			},
			"histograms":[
				[
					2234.567,
					{
					"count":"6",
					"sum":"3897",
					"buckets":[
						[
							1,
							"-4870.992343051145",
							"-4466.7196729968955",
							"1"
						],
						[
							1,
							"-861.0779292198035",
							"-789.6119426088657",
							"1"
						],
						[
							1,
							"-558.3399591246119",
							"-512",
							"1"
						],
						[
							0,
							"2048",
							"2233.3598364984477",
							"1"
						],
						[
							0,
							"2896.3093757400984",
							"3158.4477704354626",
							"1"
						],
						[
							0,
							"4466.7196729968955",
							"4870.992343051145",
							"1"
						]
					]
					}
				],
				[
					22345.678,
					{
					"count":"6",
					"sum":"3897",
					"buckets":[
						[
							1,
							"-4870.992343051145",
							"-4466.7196729968955",
							"1"
						],
						[
							1,
							"-861.0779292198035",
							"-789.6119426088657",
							"1"
						],
						[
							1,
							"-558.3399591246119",
							"-512",
							"1"
						],
						[
							0,
							"2048",
							"2233.3598364984477",
							"1"
						],
						[
							0,
							"2896.3093757400984",
							"3158.4477704354626",
							"1"
						],
						[
							0,
							"4466.7196729968955",
							"4870.992343051145",
							"1"
						]
					]
					}
				]
			]
		}
	]`
	sampleHistogramPairMatrixValue = Matrix{
		&SampleStream{
			Metric: Metric{
				MetricNameLabel: "test_metric",
			},
			Histograms: []SampleHistogramPair{
				{
					Histogram: genSampleHistogram(),
					Timestamp: 1234567,
				},
				{
					Histogram: genSampleHistogram(),
					Timestamp: 12345678,
				},
			},
		},
		&SampleStream{
			Metric: Metric{
				"foo": "bar",
			},
			Histograms: []SampleHistogramPair{
				{
					Histogram: genSampleHistogram(),
					Timestamp: 2234567,
				},
				{
					Histogram: genSampleHistogram(),
					Timestamp: 22345678,
				},
			},
		},
	}
)

func genSampleHistogram() *SampleHistogram {
	return &SampleHistogram{
		Count: 6,
		Sum:   3897,
		Buckets: HistogramBuckets{
			{
				Boundaries: 1,
				Lower:      -4870.992343051145,
				Upper:      -4466.7196729968955,
				Count:      1,
			},
			{
				Boundaries: 1,
				Lower:      -861.0779292198035,
				Upper:      -789.6119426088657,
				Count:      1,
			},
			{
				Boundaries: 1,
				Lower:      -558.3399591246119,
				Upper:      -512,
				Count:      1,
			},
			{
				Boundaries: 0,
				Lower:      2048,
				Upper:      2233.3598364984477,
				Count:      1,
			},
			{
				Boundaries: 0,
				Lower:      2896.3093757400984,
				Upper:      3158.4477704354626,
				Count:      1,
			},
			{
				Boundaries: 0,
				Lower:      4466.7196729968955,
				Upper:      4870.992343051145,
				Count:      1,
			},
		},
	}
}

func TestSampleHistogramPairJSON(t *testing.T) {
	input := []struct {
		plain string
		value SampleHistogramPair
	}{
		{
			plain: `[
				1234.567,
				{
					"count":"6",
					"sum":"3897",
					"buckets":[
						[
							1,
							"-4870.992343051145",
							"-4466.7196729968955",
							"1"
						],
						[
							1,
							"-861.0779292198035",
							"-789.6119426088657",
							"1"
						],
						[
							1,
							"-558.3399591246119",
							"-512",
							"1"
						],
						[
							0,
							"2048",
							"2233.3598364984477",
							"1"
						],
						[
							0,
							"2896.3093757400984",
							"3158.4477704354626",
							"1"
						],
						[
							0,
							"4466.7196729968955",
							"4870.992343051145",
							"1"
						]
					]
				}
			]`,
			value: SampleHistogramPair{
				Histogram: genSampleHistogram(),
				Timestamp: 1234567,
			},
		},
	}

	for _, test := range input {
		b, err := json.Marshal(test.value)
		if err != nil {
			t.Error(err)
			continue
		}

		trimmed := noWhitespace.ReplaceAllString(test.plain, "")
		if string(b) != trimmed {
			t.Errorf("encoding error: expected %q, got %q", trimmed, b)
			continue
		}

		var sp SampleHistogramPair
		err = json.Unmarshal(b, &sp)
		if err != nil {
			t.Error(err)
			continue
		}

		if !sp.Equal(&test.value) {
			t.Errorf("decoding error: expected %v, got %v", test.value, sp)
		}
	}
}

func TestInvalidSampleHistogramPairJSON(t *testing.T) {
	s1 := SampleHistogramPair{
		Timestamp: 1,
		Histogram: nil,
	}
	d, err := json.Marshal(s1)
	if err == nil {
		t.Errorf("expected error when trying to marshal invalid SampleHistogramPair %s", string(d))
	}

	var s2 SampleHistogramPair
	plain := "[0.001,null]"
	err = json.Unmarshal([]byte(plain), &s2)
	if err == nil {
		t.Errorf("expected error when trying to unmarshal invalid SampleHistogramPair %s", plain)
	}
}

func TestSampleHistogramJSON(t *testing.T) {
	input := []struct {
		plain string
		value Sample
	}{
		{
			plain: `{
				"metric":{
					"__name__":"test_metric"
				},
				"histogram":[
					1234.567,
					{
						"count":"6",
						"sum":"3897",
						"buckets":[
							[
								1,
								"-4870.992343051145",
								"-4466.7196729968955",
								"1"
							],
							[
								1,
								"-861.0779292198035",
								"-789.6119426088657",
								"1"
							],
							[
								1,
								"-558.3399591246119",
								"-512",
								"1"
							],
							[
								0,
								"2048",
								"2233.3598364984477",
								"1"
							],
							[
								0,
								"2896.3093757400984",
								"3158.4477704354626",
								"1"
							],
							[
								0,
								"4466.7196729968955",
								"4870.992343051145",
								"1"
							]
						]
					}
				]
			}`,
			value: Sample{
				Metric: Metric{
					MetricNameLabel: "test_metric",
				},
				Histogram: genSampleHistogram(),
				Timestamp: 1234567,
			},
		},
	}

	for _, test := range input {
		b, err := json.Marshal(test.value)
		if err != nil {
			t.Error(err)
			continue
		}

		trimmed := noWhitespace.ReplaceAllString(test.plain, "")
		if string(b) != trimmed {
			t.Errorf("encoding error: expected %q, got %q", trimmed, b)
			continue
		}

		var sv Sample
		err = json.Unmarshal(b, &sv)
		if err != nil {
			t.Error(err)
			continue
		}

		if !reflect.DeepEqual(sv, test.value) {
			t.Errorf("decoding error: expected %v, got %v", test.value, sv)
		}
	}
}

func TestVectorHistogramJSON(t *testing.T) {
	input := []struct {
		plain string
		value Vector
	}{
		{
			plain: `[
				{
					"metric":{
						"__name__":"test_metric"
					},
					"histogram":[
						1234.567,
						{
							"count":"6",
							"sum":"3897",
							"buckets":[
							[
								1,
								"-4870.992343051145",
								"-4466.7196729968955",
								"1"
							],
							[
								1,
								"-861.0779292198035",
								"-789.6119426088657",
								"1"
							],
							[
								1,
								"-558.3399591246119",
								"-512",
								"1"
							],
							[
								0,
								"2048",
								"2233.3598364984477",
								"1"
							],
							[
								0,
								"2896.3093757400984",
								"3158.4477704354626",
								"1"
							],
							[
								0,
								"4466.7196729968955",
								"4870.992343051145",
								"1"
							]
							]
						}
					]
				}
			]`,
			value: Vector{&Sample{
				Metric: Metric{
					MetricNameLabel: "test_metric",
				},
				Histogram: genSampleHistogram(),
				Timestamp: 1234567,
			}},
		},
		{
			plain: `[
				{
					"metric":{
						"__name__":"test_metric"
					},
					"histogram":[
						1234.567,
						{
							"count":"6",
							"sum":"3897",
							"buckets":[
							[
								1,
								"-4870.992343051145",
								"-4466.7196729968955",
								"1"
							],
							[
								1,
								"-861.0779292198035",
								"-789.6119426088657",
								"1"
							],
							[
								1,
								"-558.3399591246119",
								"-512",
								"1"
							],
							[
								0,
								"2048",
								"2233.3598364984477",
								"1"
							],
							[
								0,
								"2896.3093757400984",
								"3158.4477704354626",
								"1"
							],
							[
								0,
								"4466.7196729968955",
								"4870.992343051145",
								"1"
							]
							]
						}
					]
				},
				{
					"metric":{
						"foo":"bar"
					},
					"histogram":[
						1.234,
						{
							"count":"6",
							"sum":"3897",
							"buckets":[
							[
								1,
								"-4870.992343051145",
								"-4466.7196729968955",
								"1"
							],
							[
								1,
								"-861.0779292198035",
								"-789.6119426088657",
								"1"
							],
							[
								1,
								"-558.3399591246119",
								"-512",
								"1"
							],
							[
								0,
								"2048",
								"2233.3598364984477",
								"1"
							],
							[
								0,
								"2896.3093757400984",
								"3158.4477704354626",
								"1"
							],
							[
								0,
								"4466.7196729968955",
								"4870.992343051145",
								"1"
							]
							]
						}
					]
				}
			]`,
			value: Vector{
				&Sample{
					Metric: Metric{
						MetricNameLabel: "test_metric",
					},
					Histogram: genSampleHistogram(),
					Timestamp: 1234567,
				},
				&Sample{
					Metric: Metric{
						"foo": "bar",
					},
					Histogram: genSampleHistogram(),
					Timestamp: 1234,
				},
			},
		},
	}

	for _, test := range input {
		b, err := json.Marshal(test.value)
		if err != nil {
			t.Error(err)
			continue
		}

		trimmed := noWhitespace.ReplaceAllString(test.plain, "")
		if string(b) != trimmed {
			t.Errorf("encoding error: expected %q, got %q", trimmed, b)
			continue
		}

		var vec Vector
		err = json.Unmarshal(b, &vec)
		if err != nil {
			t.Error(err)
			continue
		}

		if !reflect.DeepEqual(vec, test.value) {
			t.Errorf("decoding error: expected %v, got %v", test.value, vec)
		}
	}
}

func TestMatrixHistogramJSON(t *testing.T) {
	input := []struct {
		plain string
		value Matrix
	}{
		{
			plain: `[]`,
			value: Matrix{},
		},
		{
			plain: sampleHistogramPairMatrixPlain,
			value: sampleHistogramPairMatrixValue,
		},
	}

	for _, test := range input {
		b, err := json.Marshal(test.value)
		if err != nil {
			t.Error(err)
			continue
		}

		trimmed := noWhitespace.ReplaceAllString(test.plain, "")
		if string(b) != trimmed {
			t.Errorf("encoding error: expected %q, got %q", trimmed, b)
			continue
		}

		var mat Matrix
		err = json.Unmarshal(b, &mat)
		if err != nil {
			t.Error(err)
			continue
		}

		if !reflect.DeepEqual(mat, test.value) {
			t.Errorf("decoding error: expected %v, got %v", test.value, mat)
		}
	}
}

func BenchmarkJSONMarshallingSampleHistogramPairMatrix(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_, err := json.Marshal(sampleHistogramPairMatrixValue)
		require.NoErrorf(b, err, "error marshalling")
	}
}