Merge pull request #14821 from charleskorn/nh-negative-multiplication-division

promql: correctly handle unary negation of native histograms and add tests for multiplication and division of native histograms by negative scalars
This commit is contained in:
Björn Rabenstein 2024-09-10 15:23:00 +02:00 committed by GitHub
commit 8114f9a281
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 223 additions and 93 deletions

View file

@ -131,6 +131,54 @@ func TestFloatHistogramMul(t *testing.T) {
NegativeBuckets: []float64{9, 3, 15, 18},
},
},
{
"negation",
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: 11,
Count: 30,
Sum: 23,
PositiveSpans: []Span{{-2, 2}, {1, 3}},
PositiveBuckets: []float64{1, 0, 3, 4, 7},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{3, 1, 5, 6},
},
-1,
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: -11,
Count: -30,
Sum: -23,
PositiveSpans: []Span{{-2, 2}, {1, 3}},
PositiveBuckets: []float64{-1, 0, -3, -4, -7},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{-3, -1, -5, -6},
},
},
{
"negative multiplier",
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: 11,
Count: 30,
Sum: 23,
PositiveSpans: []Span{{-2, 2}, {1, 3}},
PositiveBuckets: []float64{1, 0, 3, 4, 7},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{3, 1, 5, 6},
},
-2,
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: -22,
Count: -60,
Sum: -46,
PositiveSpans: []Span{{-2, 2}, {1, 3}},
PositiveBuckets: []float64{-2, 0, -6, -8, -14},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{-6, -2, -10, -12},
},
},
{
"no-op with custom buckets",
&FloatHistogram{
@ -409,6 +457,54 @@ func TestFloatHistogramDiv(t *testing.T) {
NegativeBuckets: []float64{1.5, 0.5, 2.5, 3},
},
},
{
"negation",
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: 5.5,
Count: 3493.3,
Sum: 2349209.324,
PositiveSpans: []Span{{-2, 1}, {2, 3}},
PositiveBuckets: []float64{1, 3.3, 4.2, 0.1},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{3.1, 3, 1.234e5, 1000},
},
-1,
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: -5.5,
Count: -3493.3,
Sum: -2349209.324,
PositiveSpans: []Span{{-2, 1}, {2, 3}},
PositiveBuckets: []float64{-1, -3.3, -4.2, -0.1},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{-3.1, -3, -1.234e5, -1000},
},
},
{
"negative half",
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: 11,
Count: 30,
Sum: 23,
PositiveSpans: []Span{{-2, 2}, {1, 3}},
PositiveBuckets: []float64{1, 0, 3, 4, 7},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{3, 1, 5, 6},
},
-2,
&FloatHistogram{
ZeroThreshold: 0.01,
ZeroCount: -5.5,
Count: -15,
Sum: -11.5,
PositiveSpans: []Span{{-2, 2}, {1, 3}},
PositiveBuckets: []float64{-0.5, 0, -1.5, -2, -3.5},
NegativeSpans: []Span{{3, 2}, {3, 2}},
NegativeBuckets: []float64{-1.5, -0.5, -2.5, -3},
},
},
{
"no-op with custom buckets",
&FloatHistogram{

View file

@ -1815,6 +1815,9 @@ func (ev *evaluator) eval(ctx context.Context, expr parser.Expr) (parser.Value,
for j := range mat[i].Floats {
mat[i].Floats[j].F = -mat[i].Floats[j].F
}
for j := range mat[i].Histograms {
mat[i].Histograms[j].H = mat[i].Histograms[j].H.Copy().Mul(-1)
}
}
if !ev.enableDelayedNameRemoval && mat.ContainsSameLabelset() {
ev.errorf("vector cannot contain metrics with the same labelset")

View file

@ -818,12 +818,12 @@ histogram_desc_item
$$ = yylex.(*parser).newMap()
$$["sum"] = $3
}
| COUNT_DESC COLON number
| COUNT_DESC COLON signed_or_unsigned_number
{
$$ = yylex.(*parser).newMap()
$$["count"] = $3
}
| ZERO_BUCKET_DESC COLON number
| ZERO_BUCKET_DESC COLON signed_or_unsigned_number
{
$$ = yylex.(*parser).newMap()
$$["z_bucket"] = $3
@ -875,11 +875,11 @@ bucket_set : LEFT_BRACKET bucket_set_list SPACE RIGHT_BRACKET
}
;
bucket_set_list : bucket_set_list SPACE number
bucket_set_list : bucket_set_list SPACE signed_or_unsigned_number
{
$$ = append($1, $3)
}
| number
| signed_or_unsigned_number
{
$$ = []float64{$1}
}

View file

@ -410,55 +410,55 @@ const yyPrivate = 57344
const yyLast = 799
var yyAct = [...]int16{
155, 334, 332, 276, 339, 152, 226, 39, 192, 44,
291, 290, 156, 118, 82, 178, 229, 107, 106, 346,
347, 348, 349, 109, 108, 198, 239, 199, 133, 110,
105, 60, 245, 121, 6, 329, 325, 111, 328, 228,
200, 201, 160, 119, 304, 267, 293, 128, 260, 160,
151, 261, 159, 302, 358, 311, 122, 55, 89, 159,
196, 241, 242, 259, 113, 243, 114, 54, 98, 99,
302, 112, 101, 256, 104, 88, 230, 232, 234, 235,
152, 334, 332, 155, 339, 226, 39, 192, 276, 44,
291, 290, 118, 82, 178, 229, 107, 106, 346, 347,
348, 349, 109, 108, 198, 239, 199, 156, 110, 105,
6, 245, 200, 201, 133, 325, 111, 329, 228, 60,
357, 293, 328, 304, 267, 160, 266, 128, 55, 151,
302, 311, 302, 196, 340, 159, 55, 89, 54, 356,
241, 242, 355, 113, 243, 114, 54, 98, 99, 265,
112, 101, 256, 104, 88, 230, 232, 234, 235, 236,
244, 246, 249, 250, 251, 252, 253, 257, 258, 105,
333, 231, 233, 237, 238, 240, 247, 248, 103, 115,
109, 254, 255, 324, 150, 218, 110, 264, 111, 270,
77, 35, 7, 149, 188, 163, 322, 321, 173, 320,
167, 170, 323, 165, 271, 166, 2, 3, 4, 5,
263, 101, 194, 104, 180, 184, 197, 187, 186, 319,
272, 202, 203, 204, 205, 206, 207, 208, 209, 210,
211, 212, 213, 214, 215, 216, 195, 299, 103, 318,
217, 36, 298, 1, 190, 219, 220, 317, 160, 160,
316, 193, 160, 154, 182, 196, 229, 297, 159, 159,
160, 358, 159, 268, 181, 183, 239, 260, 296, 262,
159, 315, 245, 129, 314, 55, 225, 313, 161, 228,
161, 161, 259, 312, 161, 54, 86, 295, 310, 288,
289, 8, 161, 292, 162, 37, 162, 162, 49, 269,
162, 241, 242, 309, 179, 243, 180, 127, 162, 126,
308, 223, 294, 256, 48, 222, 230, 232, 234, 235,
236, 244, 246, 249, 250, 251, 252, 253, 257, 258,
160, 115, 231, 233, 237, 238, 240, 247, 248, 103,
159, 109, 254, 255, 324, 150, 357, 110, 333, 218,
111, 340, 310, 149, 77, 163, 7, 105, 35, 173,
167, 170, 161, 323, 165, 356, 166, 309, 355, 194,
2, 3, 4, 5, 308, 322, 184, 197, 162, 186,
321, 195, 202, 203, 204, 205, 206, 207, 208, 209,
210, 211, 212, 213, 214, 215, 216, 229, 129, 101,
217, 104, 219, 220, 190, 266, 270, 239, 160, 121,
268, 193, 264, 245, 55, 196, 154, 225, 159, 119,
228, 271, 188, 160, 54, 161, 103, 117, 265, 84,
262, 299, 122, 159, 320, 263, 298, 272, 10, 83,
161, 162, 241, 242, 269, 187, 243, 185, 79, 288,
289, 297, 319, 292, 256, 161, 162, 230, 232, 234,
235, 236, 244, 246, 249, 250, 251, 252, 253, 257,
258, 162, 294, 231, 233, 237, 238, 240, 247, 248,
318, 317, 316, 254, 255, 180, 315, 134, 135, 136,
137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
147, 148, 157, 158, 169, 105, 314, 296, 300, 301,
303, 223, 305, 313, 55, 222, 179, 168, 180, 84,
306, 307, 177, 125, 54, 182, 295, 176, 124, 83,
221, 312, 87, 89, 8, 181, 183, 81, 37, 86,
175, 123, 36, 98, 99, 326, 327, 101, 102, 104,
88, 127, 331, 126, 50, 336, 337, 338, 182, 335,
78, 1, 342, 341, 344, 343, 49, 48, 181, 183,
350, 351, 47, 55, 103, 352, 53, 77, 164, 56,
46, 354, 22, 54, 59, 55, 172, 9, 9, 57,
132, 45, 43, 130, 171, 54, 359, 42, 131, 41,
40, 51, 191, 353, 273, 75, 85, 189, 224, 80,
345, 18, 19, 120, 153, 20, 58, 227, 52, 116,
221, 169, 231, 233, 237, 238, 240, 247, 248, 157,
158, 164, 254, 255, 168, 10, 182, 300, 55, 301,
303, 47, 305, 46, 132, 79, 181, 183, 54, 306,
307, 45, 134, 135, 136, 137, 138, 139, 140, 141,
142, 143, 144, 145, 146, 147, 148, 43, 59, 50,
84, 9, 9, 121, 326, 78, 327, 130, 171, 121,
83, 42, 131, 119, 335, 336, 337, 331, 185, 119,
338, 261, 342, 341, 344, 343, 122, 117, 41, 177,
350, 351, 122, 55, 176, 352, 53, 77, 40, 56,
125, 354, 22, 54, 84, 124, 172, 175, 51, 57,
191, 353, 273, 85, 83, 189, 359, 224, 123, 80,
345, 120, 81, 153, 58, 75, 227, 52, 116, 0,
0, 18, 19, 0, 0, 20, 0, 0, 0, 0,
0, 76, 0, 0, 0, 0, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
0, 0, 0, 13, 0, 0, 0, 24, 0, 30,
0, 0, 31, 32, 55, 38, 0, 53, 77, 0,
0, 0, 31, 32, 55, 38, 105, 53, 77, 0,
56, 275, 0, 22, 54, 0, 0, 0, 274, 0,
57, 0, 278, 279, 277, 284, 286, 283, 285, 280,
281, 282, 287, 0, 0, 0, 75, 0, 0, 0,
0, 0, 18, 19, 0, 0, 20, 0, 0, 0,
0, 0, 76, 0, 0, 0, 0, 61, 62, 63,
281, 282, 287, 87, 89, 0, 75, 0, 0, 0,
0, 0, 18, 19, 98, 99, 20, 0, 101, 102,
104, 88, 76, 0, 0, 0, 0, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
74, 0, 0, 0, 13, 0, 0, 0, 24, 0,
74, 0, 0, 0, 13, 103, 0, 0, 24, 0,
30, 0, 55, 31, 32, 53, 77, 0, 56, 330,
0, 22, 54, 0, 0, 0, 0, 0, 57, 0,
278, 279, 277, 284, 286, 283, 285, 280, 281, 282,
@ -493,51 +493,51 @@ var yyAct = [...]int16{
}
var yyPact = [...]int16{
32, 106, 569, 569, 405, 526, -1000, -1000, -1000, 105,
28, 102, 569, 569, 405, 526, -1000, -1000, -1000, 98,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, 277, -1000, 297, -1000, 650,
-1000, -1000, -1000, -1000, -1000, 342, -1000, 204, -1000, 650,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, 22, 95, -1000, -1000, 483, -1000, 483, 101,
-1000, -1000, 21, 93, -1000, -1000, 483, -1000, 483, 97,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, 167, -1000, -1000,
281, -1000, -1000, 309, -1000, 23, -1000, -50, -50, -50,
-50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
-50, -50, -50, 48, 174, 336, 95, -56, -1000, 262,
262, 324, -1000, 631, 103, -1000, 280, -1000, -1000, 274,
241, -1000, -1000, -1000, 187, -1000, 180, -1000, 159, 483,
-1000, -57, -40, -1000, 483, 483, 483, 483, 483, 483,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, 307, -1000, -1000,
338, -1000, -1000, 225, -1000, 23, -1000, -44, -44, -44,
-44, -44, -44, -44, -44, -44, -44, -44, -44, -44,
-44, -44, -44, 47, 171, 259, 93, -57, -1000, 249,
249, 324, -1000, 631, 75, -1000, 327, -1000, -1000, 222,
130, -1000, -1000, -1000, 298, -1000, 112, -1000, 159, 483,
-1000, -58, -48, -1000, 483, 483, 483, 483, 483, 483,
483, 483, 483, 483, 483, 483, 483, 483, 483, -1000,
165, -1000, -1000, 94, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, 40, 40, 269, -1000, -1000, -1000, -1000, 155, -1000,
-1000, 41, -1000, 650, -1000, -1000, 31, -1000, 170, -1000,
-1000, -1000, -1000, -1000, 163, -1000, -1000, -1000, -1000, -1000,
19, 144, 140, -1000, -1000, -1000, 404, 16, 262, 262,
262, 262, 103, 103, 251, 251, 251, 715, 696, 251,
251, 715, 103, 103, 251, 103, 16, -1000, 24, -1000,
-1000, -1000, 265, -1000, 189, -1000, -1000, -1000, -1000, -1000,
39, -1000, -1000, 90, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, 36, 36, 229, -1000, -1000, -1000, -1000, 174, -1000,
-1000, 180, -1000, 650, -1000, -1000, 301, -1000, 105, -1000,
-1000, -1000, -1000, -1000, 44, -1000, -1000, -1000, -1000, -1000,
18, 157, 83, -1000, -1000, -1000, 404, 15, 249, 249,
249, 249, 75, 75, 402, 402, 402, 715, 696, 402,
402, 715, 75, 75, 402, 75, 15, -1000, 19, -1000,
-1000, -1000, 186, -1000, 155, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
483, -1000, -1000, -1000, -1000, -1000, -1000, 34, 34, 18,
34, 44, 44, 110, 38, -1000, -1000, 285, 267, 260,
240, 236, 235, 234, 206, 188, 134, 129, -1000, -1000,
-1000, -1000, -1000, -1000, 102, -1000, -1000, -1000, 14, -1000,
650, -1000, -1000, -1000, 34, -1000, 12, 9, 482, -1000,
-1000, -1000, 51, 81, 40, 40, 40, 97, 97, 51,
97, 51, -73, -1000, -1000, -1000, -1000, -1000, 34, 34,
-1000, -1000, -1000, 34, -1000, -1000, -1000, -1000, -1000, -1000,
40, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, 104, -1000, 33, -1000, -1000, -1000, -1000,
483, -1000, -1000, -1000, -1000, -1000, -1000, 31, 31, 17,
31, 37, 37, 206, 34, -1000, -1000, 197, 191, 188,
185, 164, 161, 153, 133, 113, 111, 110, -1000, -1000,
-1000, -1000, -1000, -1000, 101, -1000, -1000, -1000, 13, -1000,
650, -1000, -1000, -1000, 31, -1000, 16, 11, 482, -1000,
-1000, -1000, 33, 163, 163, 163, 36, 40, 40, 33,
40, 33, -74, -1000, -1000, -1000, -1000, -1000, 31, 31,
-1000, -1000, -1000, 31, -1000, -1000, -1000, -1000, -1000, -1000,
163, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, 38, -1000, 160, -1000, -1000, -1000, -1000,
}
var yyPgo = [...]int16{
0, 379, 13, 378, 6, 15, 377, 344, 376, 374,
373, 370, 198, 294, 369, 14, 368, 10, 11, 367,
366, 8, 364, 3, 4, 363, 2, 1, 0, 362,
12, 5, 361, 360, 18, 158, 359, 358, 7, 357,
354, 17, 353, 31, 352, 9, 351, 350, 340, 332,
327, 326, 314, 321, 302,
0, 368, 12, 367, 5, 14, 366, 298, 364, 363,
361, 360, 265, 211, 359, 13, 357, 10, 11, 355,
353, 7, 352, 8, 4, 351, 2, 1, 3, 350,
27, 0, 348, 338, 17, 193, 328, 312, 6, 311,
308, 16, 307, 39, 297, 9, 281, 274, 273, 271,
234, 218, 299, 163, 161,
}
var yyR1 = [...]int8{
@ -630,9 +630,9 @@ var yyChk = [...]int16{
-38, -27, 19, -27, 26, -27, -21, -21, 24, 17,
2, 17, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 21, 2, 22, -4, -27, 26, 26,
17, -23, -26, 57, -27, -31, -28, -28, -28, -24,
17, -23, -26, 57, -27, -31, -31, -31, -28, -24,
14, -24, -26, -24, -26, -11, 92, 93, 94, 95,
-27, -27, -27, -25, -28, 24, 21, 2, 21, -28,
-27, -27, -27, -25, -31, 24, 21, 2, 21, -31,
}
var yyDef = [...]int16{

View file

@ -610,6 +610,9 @@ func lexBuckets(l *Lexer) stateFn {
case isSpace(r):
l.emit(SPACE)
return lexSpace
case r == '-':
l.emit(SUB)
return lexNumber
case isDigit(r):
l.backup()
return lexNumber

View file

@ -4084,17 +4084,17 @@ func TestParseHistogramSeries(t *testing.T) {
},
{
name: "all properties used",
input: `{} {{schema:1 sum:-0.3 count:3.1 z_bucket:7.1 z_bucket_w:0.05 buckets:[5.1 10 7] offset:-3 n_buckets:[4.1 5] n_offset:-5 counter_reset_hint:gauge}}`,
input: `{} {{schema:1 sum:0.3 count:3.1 z_bucket:7.1 z_bucket_w:0.05 buckets:[5.1 10 7] offset:3 n_buckets:[4.1 5] n_offset:5 counter_reset_hint:gauge}}`,
expected: []histogram.FloatHistogram{{
Schema: 1,
Sum: -0.3,
Sum: 0.3,
Count: 3.1,
ZeroCount: 7.1,
ZeroThreshold: 0.05,
PositiveBuckets: []float64{5.1, 10, 7},
PositiveSpans: []histogram.Span{{Offset: -3, Length: 3}},
PositiveSpans: []histogram.Span{{Offset: 3, Length: 3}},
NegativeBuckets: []float64{4.1, 5},
NegativeSpans: []histogram.Span{{Offset: -5, Length: 2}},
NegativeSpans: []histogram.Span{{Offset: 5, Length: 2}},
CounterResetHint: histogram.GaugeType,
}},
},
@ -4114,6 +4114,22 @@ func TestParseHistogramSeries(t *testing.T) {
CounterResetHint: histogram.GaugeType,
}},
},
{
name: "all properties used, with negative values where supported",
input: `{} {{schema:1 sum:-0.3 count:-3.1 z_bucket:-7.1 z_bucket_w:0.05 buckets:[-5.1 -10 -7] offset:-3 n_buckets:[-4.1 -5] n_offset:-5 counter_reset_hint:gauge}}`,
expected: []histogram.FloatHistogram{{
Schema: 1,
Sum: -0.3,
Count: -3.1,
ZeroCount: -7.1,
ZeroThreshold: 0.05,
PositiveBuckets: []float64{-5.1, -10, -7},
PositiveSpans: []histogram.Span{{Offset: -3, Length: 3}},
NegativeBuckets: []float64{-4.1, -5},
NegativeSpans: []histogram.Span{{Offset: -5, Length: 2}},
CounterResetHint: histogram.GaugeType,
}},
},
{
name: "static series",
input: `{} {{buckets:[5 10 7] schema:1}}x2`,

View file

@ -720,27 +720,39 @@ eval instant at 10m histogram_sum(scalar(histogram_fraction(-Inf, +Inf, sum(hist
# Apply multiplication and division operator to histogram.
load 10m
histogram_mul_div {{schema:0 count:21 sum:33 z_bucket:3 z_bucket_w:0.001 buckets:[3 3 3] n_buckets:[3 3 3]}}x1
histogram_mul_div {{schema:0 count:30 sum:33 z_bucket:3 z_bucket_w:0.001 buckets:[3 3 3] n_buckets:[6 6 6]}}x1
float_series_3 3+0x1
float_series_0 0+0x1
eval instant at 10m histogram_mul_div*3
{} {{schema:0 count:63 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[9 9 9]}}
{} {{schema:0 count:90 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[18 18 18]}}
eval instant at 10m histogram_mul_div*-1
{} {{schema:0 count:-30 sum:-33 z_bucket:-3 z_bucket_w:0.001 buckets:[-3 -3 -3] n_buckets:[-6 -6 -6]}}
eval instant at 10m -histogram_mul_div
{} {{schema:0 count:-30 sum:-33 z_bucket:-3 z_bucket_w:0.001 buckets:[-3 -3 -3] n_buckets:[-6 -6 -6]}}
eval instant at 10m histogram_mul_div*-3
{} {{schema:0 count:-90 sum:-99 z_bucket:-9 z_bucket_w:0.001 buckets:[-9 -9 -9] n_buckets:[-18 -18 -18]}}
eval instant at 10m 3*histogram_mul_div
{} {{schema:0 count:63 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[9 9 9]}}
{} {{schema:0 count:90 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[18 18 18]}}
eval instant at 10m histogram_mul_div*float_series_3
{} {{schema:0 count:63 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[9 9 9]}}
{} {{schema:0 count:90 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[18 18 18]}}
eval instant at 10m float_series_3*histogram_mul_div
{} {{schema:0 count:63 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[9 9 9]}}
{} {{schema:0 count:90 sum:99 z_bucket:9 z_bucket_w:0.001 buckets:[9 9 9] n_buckets:[18 18 18]}}
eval instant at 10m histogram_mul_div/3
{} {{schema:0 count:7 sum:11 z_bucket:1 z_bucket_w:0.001 buckets:[1 1 1] n_buckets:[1 1 1]}}
{} {{schema:0 count:10 sum:11 z_bucket:1 z_bucket_w:0.001 buckets:[1 1 1] n_buckets:[2 2 2]}}
eval instant at 10m histogram_mul_div/-3
{} {{schema:0 count:-10 sum:-11 z_bucket:-1 z_bucket_w:0.001 buckets:[-1 -1 -1] n_buckets:[-2 -2 -2]}}
eval instant at 10m histogram_mul_div/float_series_3
{} {{schema:0 count:7 sum:11 z_bucket:1 z_bucket_w:0.001 buckets:[1 1 1] n_buckets:[1 1 1]}}
{} {{schema:0 count:10 sum:11 z_bucket:1 z_bucket_w:0.001 buckets:[1 1 1] n_buckets:[2 2 2]}}
eval instant at 10m histogram_mul_div*0
{} {{schema:0 count:0 sum:0 z_bucket:0 z_bucket_w:0.001 buckets:[0 0 0] n_buckets:[0 0 0]}}