Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
cb136c07
Commit
cb136c07
authored
Mar 31, 2017
by
Alexander Zobnin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
heatmap: add function for bucket size calculation
parent
9ddfeaa9
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
112 additions
and
6 deletions
+112
-6
public/app/plugins/panel/heatmap/heatmap_data_converter.ts
+49
-4
public/app/plugins/panel/heatmap/specs/heatmap_data_converter_specs.ts
+63
-2
No files found.
public/app/plugins/panel/heatmap/heatmap_data_converter.ts
View file @
cb136c07
...
...
@@ -44,7 +44,7 @@ function convertEsSeriesToHeatmap(series: TimeSeries, saveZeroCounts = false) {
buckets
:
valueBuckets
};
// Don't push buckets
v
ith 0 count until saveZeroCounts flag is set
// Don't push buckets
w
ith 0 count until saveZeroCounts flag is set
if
(
count
!==
0
||
(
count
===
0
&&
saveZeroCounts
))
{
xBuckets
.
push
(
xBucket
);
}
...
...
@@ -404,12 +404,56 @@ function getMinLog(series) {
return
_
.
min
(
values
);
}
// Logarithm for custom base
/**
* Logarithm for custom base
* @param value
* @param base logarithm base
*/
function
logp
(
value
,
base
)
{
return
Math
.
log
(
value
)
/
Math
.
log
(
base
);
}
/**
* Calculate size of Y bucket from given buckets bounds.
* @param bounds Array of Y buckets bounds
* @param logBase Logarithm base
*/
function
calculateBucketSize
(
bounds
:
number
[],
logBase
=
1
):
number
{
let
bucketSize
=
Infinity
;
if
(
bounds
.
length
===
0
)
{
return
0
;
}
else
if
(
bounds
.
length
===
1
)
{
return
bounds
[
0
];
}
else
{
bounds
=
_
.
sortBy
(
bounds
);
for
(
let
i
=
1
;
i
<
bounds
.
length
;
i
++
)
{
let
distance
=
getDistance
(
bounds
[
i
],
bounds
[
i
-
1
],
logBase
);
bucketSize
=
distance
<
bucketSize
?
distance
:
bucketSize
;
}
}
return
bucketSize
;
}
/**
* Calculate distance between two numbers in given scale (linear or logarithmic).
* @param a
* @param b
* @param logBase
*/
function
getDistance
(
a
:
number
,
b
:
number
,
logBase
=
1
):
number
{
if
(
logBase
===
1
)
{
// Linear distance
return
Math
.
abs
(
b
-
a
);
}
else
{
// logarithmic distance
let
ratio
=
Math
.
max
(
a
,
b
)
/
Math
.
min
(
a
,
b
);
return
logp
(
ratio
,
logBase
);
}
}
/**
* Compare two heatmap data objects
* @param objA
* @param objB
...
...
@@ -427,7 +471,7 @@ function isHeatmapDataEqual(objA: any, objB: any): boolean {
_
.
forEach
(
xBucket
.
buckets
,
(
yBucket
:
YBucket
,
y
)
=>
{
if
(
objB
[
x
].
buckets
&&
objB
[
x
].
buckets
[
y
])
{
if
(
objB
[
x
].
buckets
[
y
].
values
)
{
is_eql
=
_
.
isEqual
(
yBucket
.
values
.
sort
(),
objB
[
x
].
buckets
[
y
].
values
.
sort
(
));
is_eql
=
_
.
isEqual
(
_
.
sortBy
(
yBucket
.
values
),
_
.
sortBy
(
objB
[
x
].
buckets
[
y
].
values
));
if
(
!
is_eql
)
{
return
false
;
}
...
...
@@ -465,5 +509,6 @@ export {
mergeZeroBuckets
,
getMinLog
,
getValueBucketBound
,
isHeatmapDataEqual
isHeatmapDataEqual
,
calculateBucketSize
};
public/app/plugins/panel/heatmap/specs/heatmap_data_converter_specs.ts
View file @
cb136c07
...
...
@@ -3,7 +3,7 @@
import
_
from
'lodash'
;
import
{
describe
,
beforeEach
,
it
,
sinon
,
expect
,
angularMocks
}
from
'../../../../../test/lib/common'
;
import
TimeSeries
from
'app/core/time_series2'
;
import
{
convertToHeatMap
,
elasticHistogramToHeatmap
,
isHeatmapDataEqual
}
from
'../heatmap_data_converter'
;
import
{
convertToHeatMap
,
elasticHistogramToHeatmap
,
calculateBucketSize
,
isHeatmapDataEqual
}
from
'../heatmap_data_converter'
;
describe
(
'isHeatmapDataEqual'
,
()
=>
{
let
ctx
:
any
=
{};
...
...
@@ -64,6 +64,55 @@ describe('isHeatmapDataEqual', () => {
});
});
describe
(
'calculateBucketSize'
,
()
=>
{
let
ctx
:
any
=
{};
describe
(
'when logBase is 1 (linear scale)'
,
()
=>
{
beforeEach
(()
=>
{
ctx
.
logBase
=
1
;
ctx
.
bounds_set
=
[
{
bounds
:
[],
size
:
0
},
{
bounds
:
[
0
],
size
:
0
},
{
bounds
:
[
4
],
size
:
4
},
{
bounds
:
[
0
,
1
,
2
,
3
,
4
],
size
:
1
},
{
bounds
:
[
0
,
1
,
3
,
5
,
7
],
size
:
1
},
{
bounds
:
[
0
,
3
,
7
,
9
,
15
],
size
:
2
},
{
bounds
:
[
0
,
7
,
3
,
15
,
9
],
size
:
2
},
{
bounds
:
[
0
,
5
,
10
,
15
,
50
],
size
:
5
}
];
});
it
(
'should properly calculate bucket size'
,
()
=>
{
_
.
each
(
ctx
.
bounds_set
,
(
b
)
=>
{
let
bucketSize
=
calculateBucketSize
(
b
.
bounds
,
ctx
.
logBase
);
expect
(
bucketSize
).
to
.
be
(
b
.
size
);
});
});
});
describe
(
'when logBase is 2'
,
()
=>
{
beforeEach
(()
=>
{
ctx
.
logBase
=
2
;
ctx
.
bounds_set
=
[
{
bounds
:
[],
size
:
0
},
{
bounds
:
[
0
],
size
:
0
},
{
bounds
:
[
4
],
size
:
4
},
{
bounds
:
[
1
,
2
,
4
,
8
],
size
:
1
},
{
bounds
:
[
1
,
Math
.
SQRT2
,
2
,
8
,
16
],
size
:
0.5
}
];
});
it
(
'should properly calculate bucket size'
,
()
=>
{
_
.
each
(
ctx
.
bounds_set
,
(
b
)
=>
{
let
bucketSize
=
calculateBucketSize
(
b
.
bounds
,
ctx
.
logBase
);
expect
(
isEqual
(
bucketSize
,
b
.
size
)).
to
.
be
(
true
);
});
});
});
});
describe
(
'HeatmapDataConverter'
,
()
=>
{
let
ctx
:
any
=
{};
...
...
@@ -184,9 +233,21 @@ describe('ES Histogram converter', () => {
};
let
heatmap
=
elasticHistogramToHeatmap
(
ctx
.
series
);
console
.
log
(
heatmap
);
expect
(
isHeatmapDataEqual
(
heatmap
,
expectedHeatmap
)).
to
.
be
(
true
);
});
});
});
/**
* Compare two numbers with given precision. Suitable for compare float numbers after conversions with precision loss.
* @param a
* @param b
* @param precision
*/
function
isEqual
(
a
:
number
,
b
:
number
,
precision
=
0.000001
):
boolean
{
if
(
a
===
b
)
{
return
true
;
}
else
{
return
Math
.
abs
(
1
-
a
/
b
)
<=
precision
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment