Compare commits
698 Commits
v7.1.0-bet
...
7.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72a6c64532 | ||
|
|
cc745b75ac | ||
|
|
6210531200 | ||
|
|
3147dadfdb | ||
|
|
a3398cafd6 | ||
|
|
b699682ee4 | ||
|
|
6cd10128e6 | ||
|
|
1cd4391b9b | ||
|
|
6ff9d3ffad | ||
|
|
ef98b310f1 | ||
|
|
6c4d5466e6 | ||
|
|
616588adee | ||
|
|
76887a76b9 | ||
|
|
2b51f520a4 | ||
|
|
0582b21c42 | ||
|
|
4e1ff750e2 | ||
|
|
eb9057fc09 | ||
|
|
9930d2bfce | ||
|
|
db754555e0 | ||
|
|
01841d6ded | ||
|
|
f96e49ae0d | ||
|
|
498bfb0ed9 | ||
|
|
1e1535552f | ||
|
|
efe4941ee3 | ||
|
|
9c1403cd13 | ||
|
|
e35c7583b9 | ||
|
|
d383ac9ffb | ||
|
|
8797d753d4 | ||
|
|
c0320fbe40 | ||
|
|
f2f4f22eef | ||
|
|
a7e713fb31 | ||
|
|
b825c824c5 | ||
|
|
36c3a139e8 | ||
|
|
da2622d870 | ||
|
|
b25b66e2f6 | ||
|
|
a3fc96196a | ||
|
|
a9a053591b | ||
|
|
2870eab4d7 | ||
|
|
bdeb380c56 | ||
|
|
0bac0044a9 | ||
|
|
0d8f2fbda8 | ||
|
|
88905ca158 | ||
|
|
8406a5d319 | ||
|
|
8d71561898 | ||
|
|
8269ed2407 | ||
|
|
4676ee9dcf | ||
|
|
35bdf11c0c | ||
|
|
46bb0e3754 | ||
|
|
521f31a702 | ||
|
|
460ccc326f | ||
|
|
eca1c505c7 | ||
|
|
b112b13c2d | ||
|
|
a4689e646a | ||
|
|
cfc13f7e30 | ||
|
|
7054834af0 | ||
|
|
48bae0232c | ||
|
|
3a32c8f329 | ||
|
|
b9d4653737 | ||
|
|
7220fb5ab8 | ||
|
|
f00222ad03 | ||
|
|
6033499576 | ||
|
|
1a598a8a41 | ||
|
|
4ca888c798 | ||
|
|
569e2a2c74 | ||
|
|
27bfb61d2b | ||
|
|
ac7112876b | ||
|
|
711a051725 | ||
|
|
c3afe89ea2 | ||
|
|
dc4b97966f | ||
|
|
4d9f298098 | ||
|
|
95a688a469 | ||
|
|
1f6d68b38e | ||
|
|
d842db21d2 | ||
|
|
adb6d93442 | ||
|
|
80a19f014c | ||
|
|
25c7090cda | ||
|
|
89dbb0f074 | ||
|
|
a2b97958bd | ||
|
|
619d985214 | ||
|
|
ee59974edb | ||
|
|
109754eeb4 | ||
|
|
2c6020a57a | ||
|
|
dfa808ea25 | ||
|
|
b35af9eaa7 | ||
|
|
400aafa3b3 | ||
|
|
1e2f3ca599 | ||
|
|
acf9938f61 | ||
|
|
efe1287be9 | ||
|
|
c7b8d85ce5 | ||
|
|
22d6cfc358 | ||
|
|
6b0f56b726 | ||
|
|
5520cd2c68 | ||
|
|
7cd27d9576 | ||
|
|
431a53594b | ||
|
|
f9752f0e7a | ||
|
|
b3fb25010c | ||
|
|
883d7cb578 | ||
|
|
023054bc62 | ||
|
|
9bab551d8b | ||
|
|
5b6e156934 | ||
|
|
b2fe359a5e | ||
|
|
248c195cca | ||
|
|
32f99669ff | ||
|
|
d1358596a8 | ||
|
|
cf2597421b | ||
|
|
823911b173 | ||
|
|
581d2eaaf4 | ||
|
|
029278faeb | ||
|
|
584913197e | ||
|
|
377485cf4c | ||
|
|
02d19f0380 | ||
|
|
7762839853 | ||
|
|
dfc78d0979 | ||
|
|
561920f18b | ||
|
|
6a9bfa19be | ||
|
|
f22f0a89a6 | ||
|
|
5c31f07904 | ||
|
|
6fabfee097 | ||
|
|
09c9571462 | ||
|
|
10141c5e6c | ||
|
|
2a2992b04d | ||
|
|
cfc618ef44 | ||
|
|
d0e980c2fa | ||
|
|
4b1eb6e5c7 | ||
|
|
fb1f2746aa | ||
|
|
4e94c0959a | ||
|
|
8253b9ddb3 | ||
|
|
e71eb13386 | ||
|
|
9acb99904a | ||
|
|
5402157cb7 | ||
|
|
f6c31c2e10 | ||
|
|
6dd109b927 | ||
|
|
61bd33c241 | ||
|
|
783391a861 | ||
|
|
58af541321 | ||
|
|
b70fefe642 | ||
|
|
b3b28e9f25 | ||
|
|
f7be1ba030 | ||
|
|
72c3257d19 | ||
|
|
b6d76cdba7 | ||
|
|
d16a1f2215 | ||
|
|
444f2d5896 | ||
|
|
8e063ea82c | ||
|
|
a9daaadd50 | ||
|
|
a54df0c3cd | ||
|
|
bba4770509 | ||
|
|
ae385983f4 | ||
|
|
b867050cfb | ||
|
|
cac0e6ecd0 | ||
|
|
ddb4b77f04 | ||
|
|
7aa38f0961 | ||
|
|
92e4948658 | ||
|
|
0b6ea4c0ef | ||
|
|
d633cc3c09 | ||
|
|
febbc60e8b | ||
|
|
6c5a0421fe | ||
|
|
a8db544e85 | ||
|
|
76a167365d | ||
|
|
67467c0eaa | ||
|
|
e66e31a78d | ||
|
|
3fd6452377 | ||
|
|
15c72c2739 | ||
|
|
19c8097595 | ||
|
|
636dd96c28 | ||
|
|
20747015f6 | ||
|
|
0bc67b032a | ||
|
|
ff1149ac39 | ||
|
|
aff9e931ce | ||
|
|
1f6c2dbcfb | ||
|
|
d07755b624 | ||
|
|
f323ae6b67 | ||
|
|
8faaa1a520 | ||
|
|
8ec2aa02c6 | ||
|
|
fb2538ce1d | ||
|
|
4b8f4df18d | ||
|
|
06323b8e52 | ||
|
|
42e8cb51ec | ||
|
|
b45d5ec594 | ||
|
|
7db42f0a3c | ||
|
|
fe6d399fad | ||
|
|
6dbb803b3f | ||
|
|
1a69bcfeff | ||
|
|
46d7c3f814 | ||
|
|
11a96459ba | ||
|
|
611d416f91 | ||
|
|
7d72837d40 | ||
|
|
57b2d08755 | ||
|
|
d9630c5b71 | ||
|
|
7c49d6d944 | ||
|
|
70fb4afe74 | ||
|
|
27c6042dbf | ||
|
|
c45cf83776 | ||
|
|
8238c46350 | ||
|
|
005e048c01 | ||
|
|
c730e659e3 | ||
|
|
58627a0c38 | ||
|
|
262a42b249 | ||
|
|
093477c036 | ||
|
|
5e27654298 | ||
|
|
1e8b10ef05 | ||
|
|
66c6b20c4b | ||
|
|
ff1a931f6f | ||
|
|
a1e6090008 | ||
|
|
4cd42ed898 | ||
|
|
7121d1e63f | ||
|
|
c5a7afce44 | ||
|
|
fcb3130076 | ||
|
|
ad2e74d1fe | ||
|
|
4d14ebaacc | ||
|
|
86e44eec02 | ||
|
|
d1ee1d93c8 | ||
|
|
af97996ad1 | ||
|
|
2ee79fefac | ||
|
|
18ccd2518a | ||
|
|
9feaa91bf5 | ||
|
|
e2c7ed4b82 | ||
|
|
bf2f040fb9 | ||
|
|
c91bfd8299 | ||
|
|
6a01bab67c | ||
|
|
f5ee1f93cd | ||
|
|
88fbdd6716 | ||
|
|
ddabf4ade1 | ||
|
|
d5687cce11 | ||
|
|
84eb03e7e5 | ||
|
|
cd9a773427 | ||
|
|
daaa3e571b | ||
|
|
30d6405c53 | ||
|
|
bbbbf9ac42 | ||
|
|
ed6f0663c2 | ||
|
|
1502722129 | ||
|
|
b54c0b5d52 | ||
|
|
1778e9f034 | ||
|
|
4a6268014a | ||
|
|
f7950491a3 | ||
|
|
954a2811b3 | ||
|
|
09a1af3f91 | ||
|
|
69df8b424c | ||
|
|
c80da5f2f9 | ||
|
|
c207ea12a4 | ||
|
|
c724449d3d | ||
|
|
a6cc64290c | ||
|
|
d53fe64913 | ||
|
|
45adfe7732 | ||
|
|
a73e6f728d | ||
|
|
0fb7ee05d1 | ||
|
|
a2a6b9448f | ||
|
|
34d9191ca7 | ||
|
|
04249ae7ad | ||
|
|
a3c3484286 | ||
|
|
756b8fcdf0 | ||
|
|
a8b57a2dd0 | ||
|
|
999009bd57 | ||
|
|
e962f02fbc | ||
|
|
9f2386a219 | ||
|
|
6b2d44416d | ||
|
|
3504009914 | ||
|
|
451af74728 | ||
|
|
9e357d84a4 | ||
|
|
95432fb684 | ||
|
|
ed1b929fe5 | ||
|
|
5aba6fde41 | ||
|
|
37b3087b2c | ||
|
|
cb82cf110f | ||
|
|
98f8ec7c89 | ||
|
|
b4289a48f1 | ||
|
|
d0621b6054 | ||
|
|
660510084c | ||
|
|
a1f90521a0 | ||
|
|
96babf1268 | ||
|
|
1717476984 | ||
|
|
3b248fccc8 | ||
|
|
0e1e85656b | ||
|
|
689ca1be87 | ||
|
|
0755390286 | ||
|
|
3d18c4d614 | ||
|
|
eafc132d3d | ||
|
|
918fb4d02a | ||
|
|
dd0b0fe0b1 | ||
|
|
a2fbffe48a | ||
|
|
f33158dcdf | ||
|
|
7896836deb | ||
|
|
6145bf77cf | ||
|
|
19930ee301 | ||
|
|
5da3276db1 | ||
|
|
900eb8070e | ||
|
|
9f1165b1f6 | ||
|
|
585543d707 | ||
|
|
7319527f71 | ||
|
|
338943d349 | ||
|
|
be3bf80749 | ||
|
|
bd75adf515 | ||
|
|
50ebbb625e | ||
|
|
6609ddb082 | ||
|
|
b68634fbb4 | ||
|
|
7ad1e3663c | ||
|
|
bb0f17ce59 | ||
|
|
9698edbb13 | ||
|
|
1915d10980 | ||
|
|
aae25c5308 | ||
|
|
f9f60c9193 | ||
|
|
c63bbbaec3 | ||
|
|
d823b26b06 | ||
|
|
ef631582ba | ||
|
|
5398ef1103 | ||
|
|
eeeea7fb8d | ||
|
|
d664853179 | ||
|
|
3bed3248d9 | ||
|
|
9f159c5e3d | ||
|
|
75e14aa120 | ||
|
|
6b1b52b704 | ||
|
|
18c2aaa10e | ||
|
|
2755db6b4b | ||
|
|
b1625955fe | ||
|
|
f432e153ca | ||
|
|
1698c74ec1 | ||
|
|
a8f57b2ffd | ||
|
|
751a07e3c5 | ||
|
|
2093f7c1f0 | ||
|
|
3403db190d | ||
|
|
214c1078aa | ||
|
|
826184c948 | ||
|
|
ae30482465 | ||
|
|
e4da0fcb5e | ||
|
|
eb985ffbee | ||
|
|
02e4c2bb9e | ||
|
|
1dd5b58e95 | ||
|
|
3a362b758a | ||
|
|
a49daf5676 | ||
|
|
ad33734424 | ||
|
|
0a40862af5 | ||
|
|
9a694b2b5a | ||
|
|
6789c6ef39 | ||
|
|
61041912d5 | ||
|
|
f92bc0994d | ||
|
|
7fe2b7037a | ||
|
|
d4e85e4857 | ||
|
|
2cd9b9a7b9 | ||
|
|
e4885cc76f | ||
|
|
19e9e01178 | ||
|
|
158a474ee7 | ||
|
|
6b1a80675f | ||
|
|
9c81c7aa44 | ||
|
|
b1ddbaa395 | ||
|
|
398bc045fc | ||
|
|
37c278c8f3 | ||
|
|
bf3dcc809d | ||
|
|
eed313f312 | ||
|
|
62b103b843 | ||
|
|
8107e735c1 | ||
|
|
577c9cd546 | ||
|
|
4a523c3248 | ||
|
|
4334e34366 | ||
|
|
02b12d3a7b | ||
|
|
145d221983 | ||
|
|
06dda44573 | ||
|
|
00769f19c2 | ||
|
|
5a58f2b4c5 | ||
|
|
e26745368e | ||
|
|
541ce55670 | ||
|
|
d4af373529 | ||
|
|
325240fc83 | ||
|
|
7054eb9d24 | ||
|
|
754668cd51 | ||
|
|
744e108b04 | ||
|
|
ec783fbff4 | ||
|
|
9e5fe8dbdb | ||
|
|
e6e5cc6e80 | ||
|
|
b646a1d627 | ||
|
|
49c4edb2cb | ||
|
|
b72be0d3c7 | ||
|
|
e344ff01ec | ||
|
|
150778df1a | ||
|
|
6a86e66d76 | ||
|
|
353b3822c1 | ||
|
|
4e2ab785d6 | ||
|
|
85d0d6f7cd | ||
|
|
0706ec5d00 | ||
|
|
0e3b4e8ccc | ||
|
|
a532f463c7 | ||
|
|
df11cdad62 | ||
|
|
fa7c4d91aa | ||
|
|
41f7bccb24 | ||
|
|
f9df580016 | ||
|
|
094254c0c6 | ||
|
|
a0c1e53fd0 | ||
|
|
ec756f3729 | ||
|
|
7589b1b517 | ||
|
|
5cf8759ac0 | ||
|
|
9b532a7834 | ||
|
|
fa4084f90a | ||
|
|
c266f45858 | ||
|
|
35c67606ce | ||
|
|
16c185c3b9 | ||
|
|
5a6afd9096 | ||
|
|
8dc75f79f7 | ||
|
|
5cc65df32b | ||
|
|
bf835af74b | ||
|
|
bf5d52c5c7 | ||
|
|
d88864f376 | ||
|
|
ed950842bd | ||
|
|
ba2524cd88 | ||
|
|
3f21283655 | ||
|
|
eb0b9de044 | ||
|
|
3075b71848 | ||
|
|
e08972d567 | ||
|
|
7a5464fe10 | ||
|
|
ec76d69b49 | ||
|
|
642e904048 | ||
|
|
ef223d4143 | ||
|
|
0b8ad9176d | ||
|
|
2ba0083784 | ||
|
|
34c2f440db | ||
|
|
b28594477d | ||
|
|
977bf2eca4 | ||
|
|
bdbea6d1f2 | ||
|
|
17605033a2 | ||
|
|
6aef1f84cb | ||
|
|
cbe1d7b08c | ||
|
|
cfac143244 | ||
|
|
0d933b79b7 | ||
|
|
6c49fdb57d | ||
|
|
e3ea725387 | ||
|
|
ff6919173a | ||
|
|
cc0a8464ff | ||
|
|
76230215c5 | ||
|
|
9bbebdcac1 | ||
|
|
d17ba95492 | ||
|
|
339138d61a | ||
|
|
3defb4441e | ||
|
|
ae3c285312 | ||
|
|
f4ec92215b | ||
|
|
9d68a1fa62 | ||
|
|
95ef0417cf | ||
|
|
9ce7fdc130 | ||
|
|
000b6c3021 | ||
|
|
93a4b8e8e4 | ||
|
|
96bc16c63e | ||
|
|
c654e2bfda | ||
|
|
e6a027d905 | ||
|
|
3ed1c14237 | ||
|
|
349e7b2d70 | ||
|
|
94d0934e90 | ||
|
|
49b86e88ac | ||
|
|
5e73a92327 | ||
|
|
ca9418ea80 | ||
|
|
2446ee08f1 | ||
|
|
ad4f8b7091 | ||
|
|
1df4f71197 | ||
|
|
a94745af00 | ||
|
|
ad5f1c953b | ||
|
|
43ef052d57 | ||
|
|
80edbbe314 | ||
|
|
44f0200a58 | ||
|
|
102448040d | ||
|
|
37aa35ca45 | ||
|
|
b972963934 | ||
|
|
2e931a0ee1 | ||
|
|
1ba95183f6 | ||
|
|
b12d08d9de | ||
|
|
415638cdda | ||
|
|
3a8854b1b9 | ||
|
|
4c56eb3991 | ||
|
|
9b17fe436c | ||
|
|
e30f6b4e40 | ||
|
|
cd8049d8a3 | ||
|
|
d0e15561c7 | ||
|
|
975e9d665e | ||
|
|
183f767e18 | ||
|
|
7d08a8497a | ||
|
|
a13a9e2ef6 | ||
|
|
7b218b7198 | ||
|
|
ba50e96544 | ||
|
|
fabd879cbe | ||
|
|
7417ff015d | ||
|
|
8584c2d2d5 | ||
|
|
85f3a999f3 | ||
|
|
f9239a4d6c | ||
|
|
358c2d7031 | ||
|
|
2613ed85a6 | ||
|
|
03d97788ab | ||
|
|
bd7c26257d | ||
|
|
fb5ff6a70f | ||
|
|
f427f90a45 | ||
|
|
3c72b2f988 | ||
|
|
8663f1b323 | ||
|
|
bc3220cdc0 | ||
|
|
5d09e4539c | ||
|
|
c208c7cabe | ||
|
|
5a885ce26c | ||
|
|
6ccba48ee6 | ||
|
|
9c3f47aa23 | ||
|
|
43033ddf74 | ||
|
|
fba329f3ac | ||
|
|
9486f960d1 | ||
|
|
a1f40195be | ||
|
|
c298653623 | ||
|
|
e4be332b78 | ||
|
|
c65cef2327 | ||
|
|
44d4e63d6f | ||
|
|
a85bbee6f6 | ||
|
|
718b78c4ce | ||
|
|
1d21f3aec5 | ||
|
|
21a02b557a | ||
|
|
01afa76cce | ||
|
|
3c1346d83a | ||
|
|
903c76415c | ||
|
|
f003e3b009 | ||
|
|
528a61b86b | ||
|
|
7969d6645a | ||
|
|
8746a77407 | ||
|
|
a03177e960 | ||
|
|
7b183971fd | ||
|
|
f93c289fed | ||
|
|
373e869652 | ||
|
|
7a11ed91cb | ||
|
|
5f0be93e47 | ||
|
|
85f6addfd3 | ||
|
|
e5b6e641ec | ||
|
|
5eefbab59b | ||
|
|
d0e6822a81 | ||
|
|
06c14a10dc | ||
|
|
523c651c63 | ||
|
|
5d3ff8f00b | ||
|
|
1124da56d6 | ||
|
|
d4e4cb4c71 | ||
|
|
317c7b269c | ||
|
|
92767f00e0 | ||
|
|
b97d1f4170 | ||
|
|
35f7f7b50a | ||
|
|
6619cc4b81 | ||
|
|
cdec395fef | ||
|
|
c980f37509 | ||
|
|
21971a4df8 | ||
|
|
5fe27ee959 | ||
|
|
5046e54918 | ||
|
|
9d8ae39108 | ||
|
|
42dfdabdba | ||
|
|
590702c497 | ||
|
|
3fd810417f | ||
|
|
5b2ff4498e | ||
|
|
dd3fcab144 | ||
|
|
1de810b26a | ||
|
|
208f95a76c | ||
|
|
23e93175d1 | ||
|
|
9c0536c2f7 | ||
|
|
1f271d06e9 | ||
|
|
72cd9a3222 | ||
|
|
6b6e477846 | ||
|
|
9360d96f13 | ||
|
|
187612ca8d | ||
|
|
54ad5b869e | ||
|
|
7bbfb57dd1 | ||
|
|
077aec465c | ||
|
|
c863fd3da9 | ||
|
|
747bdaf2e7 | ||
|
|
07f8178995 | ||
|
|
d28b62740b | ||
|
|
e63028e8c6 | ||
|
|
d91e73713d | ||
|
|
9e8af660f5 | ||
|
|
cabcbf6f8d | ||
|
|
fc56c6ba04 | ||
|
|
5f78f49e67 | ||
|
|
20b603ee1a | ||
|
|
c5bdea5cec | ||
|
|
9b6b0cad21 | ||
|
|
7cdbae4ae6 | ||
|
|
bbe8cc4c84 | ||
|
|
0dd2bc8953 | ||
|
|
b1e48f429f | ||
|
|
95bf064776 | ||
|
|
73468e1481 | ||
|
|
c136f7da39 | ||
|
|
f4b6abb05e | ||
|
|
6a0f530fdf | ||
|
|
5f8eb93db1 | ||
|
|
33acf4c056 | ||
|
|
c1ede4fc71 | ||
|
|
396ff9f478 | ||
|
|
6d8545da63 | ||
|
|
d28d495235 | ||
|
|
1391575853 | ||
|
|
718d6fb25d | ||
|
|
8f78b0e7bc | ||
|
|
3d98641a45 | ||
|
|
7752434d11 | ||
|
|
5a3eb413d9 | ||
|
|
429c4c903b | ||
|
|
26cf3d9c66 | ||
|
|
64bc85963b | ||
|
|
be961c5466 | ||
|
|
49b5fc4b9a | ||
|
|
9285595c50 | ||
|
|
9948e9298f | ||
|
|
2ac1bfcc79 | ||
|
|
ddcc0c3c80 | ||
|
|
e9e74040ea | ||
|
|
be7bc293a1 | ||
|
|
53eb856d20 | ||
|
|
0428f27194 | ||
|
|
d3dcb19a5b | ||
|
|
45cfb3451b | ||
|
|
7b80e300d9 | ||
|
|
2191fe1285 | ||
|
|
4df441f822 | ||
|
|
c6a3afb4b8 | ||
|
|
c91e5adfcc | ||
|
|
3223d4b419 | ||
|
|
f242840275 | ||
|
|
ea33668014 | ||
|
|
84bf94709e | ||
|
|
14209c0ed1 | ||
|
|
6d4f72cd04 | ||
|
|
fd29b952a6 | ||
|
|
cace879c96 | ||
|
|
8ab5d2ddd9 | ||
|
|
17d87071e6 | ||
|
|
fd44c01675 | ||
|
|
89b56782c6 | ||
|
|
292c985b76 | ||
|
|
b26ef1db25 | ||
|
|
30a682a4da | ||
|
|
2b6833d0da | ||
|
|
b0fd9f03ca | ||
|
|
81e955e6b5 | ||
|
|
ba4a8256a4 | ||
|
|
52f12d10c5 | ||
|
|
74b2c2acdc | ||
|
|
9164a35240 | ||
|
|
eb4391a228 | ||
|
|
36e9d262c0 | ||
|
|
e7e854ea33 | ||
|
|
aa671c863e | ||
|
|
953a80d76f | ||
|
|
c9f22b72e3 | ||
|
|
586d26c729 | ||
|
|
e8a8159085 | ||
|
|
8f1115c6ac | ||
|
|
6b0d753728 | ||
|
|
d72c25500a | ||
|
|
3a57ba20cf | ||
|
|
0f41ca620b | ||
|
|
7e8bd0c1b7 | ||
|
|
4fc984f771 | ||
|
|
c711b792fe | ||
|
|
41d432b5ae | ||
|
|
42295898b8 | ||
|
|
8e7a88faff | ||
|
|
44dff6fdd0 | ||
|
|
632c54f91d | ||
|
|
390c80d7f5 | ||
|
|
a2737c0896 | ||
|
|
338ce0cc10 | ||
|
|
6f13f2de7d | ||
|
|
5321360021 | ||
|
|
af5dff8a1b | ||
|
|
8be735a6ec | ||
|
|
c5cd9c5648 | ||
|
|
d19d6128c9 | ||
|
|
0dd5c4e69d | ||
|
|
c0762b6ddc | ||
|
|
26852ca788 | ||
|
|
081f954a2b | ||
|
|
66460ae740 | ||
|
|
3acc2a6ac2 | ||
|
|
634d8d60d6 | ||
|
|
b06d2cf30f | ||
|
|
dec76b4556 | ||
|
|
8b46655361 | ||
|
|
b7792de16d | ||
|
|
02a46a5d61 | ||
|
|
45bbee2dea | ||
|
|
b765b4130f | ||
|
|
3720c25638 | ||
|
|
66a00ee5c9 | ||
|
|
e25c6db7e9 | ||
|
|
3ef06a0c88 | ||
|
|
2d4bcbeff6 | ||
|
|
c3d4e69a32 | ||
|
|
3e9e2db384 | ||
|
|
085b2f3dbf | ||
|
|
9e47114c45 | ||
|
|
ab172f09b2 | ||
|
|
e6ee3e1e7e | ||
|
|
9746e1f6af | ||
|
|
90a5a85eb1 | ||
|
|
5789f80e14 | ||
|
|
73e82af4df | ||
|
|
c9751707c5 | ||
|
|
b5ca2381bc | ||
|
|
bbdcd59c50 | ||
|
|
b1b44d01da | ||
|
|
55406053dc | ||
|
|
dda231009f | ||
|
|
bcaa42fbb3 | ||
|
|
039367336c | ||
|
|
81095335c4 | ||
|
|
700ab8f3d8 |
@@ -2,22 +2,11 @@ version: 2.1
|
||||
|
||||
aliases:
|
||||
# Workflow filters
|
||||
# filter-all triggers for all branches and version tags
|
||||
- &filter-all
|
||||
tags:
|
||||
only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/
|
||||
- &filter-only-release
|
||||
branches:
|
||||
only: chore/test-release-pipeline
|
||||
tags:
|
||||
only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/
|
||||
- &filter-not-release-or-master
|
||||
tags:
|
||||
ignore: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/
|
||||
branches:
|
||||
ignore:
|
||||
- master
|
||||
- chore/test-release-pipeline
|
||||
- &filter-only-master
|
||||
branches:
|
||||
only: master
|
||||
@@ -39,9 +28,12 @@ executors:
|
||||
go:
|
||||
docker:
|
||||
- image: cimg/go:1.14
|
||||
e2e:
|
||||
docker:
|
||||
- image: srclosson/grafana-plugin-ci-e2e:latest
|
||||
grafana-build:
|
||||
docker:
|
||||
- image: grafana/build-container:1.2.20
|
||||
- image: grafana/build-container:1.2.26
|
||||
grafana-publish:
|
||||
docker:
|
||||
- image: grafana/grafana-ci-deploy:1.2.5
|
||||
@@ -56,7 +48,7 @@ commands:
|
||||
- run:
|
||||
name: "Install Grafana build pipeline tool"
|
||||
command: |
|
||||
VERSION=0.4.17
|
||||
VERSION=0.5.8
|
||||
curl -fLO https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v${VERSION}/grabpl
|
||||
chmod +x grabpl
|
||||
mv grabpl /tmp
|
||||
@@ -667,8 +659,7 @@ jobs:
|
||||
# This is a release
|
||||
/tmp/grabpl publish-docker --jobs 4 --edition << parameters.edition >> --ubuntu=<< parameters.ubuntu >>
|
||||
else
|
||||
# TODO: Don't ignore errors, temporary workaround until we fix #22955
|
||||
/tmp/grabpl publish-docker --jobs 4 --edition << parameters.edition >> --ubuntu=<< parameters.ubuntu >> || echo Publishing failed!
|
||||
/tmp/grabpl publish-docker --jobs 4 --edition << parameters.edition >> --ubuntu=<< parameters.ubuntu >>
|
||||
fi
|
||||
- run:
|
||||
name: CI job failed
|
||||
@@ -680,8 +671,7 @@ jobs:
|
||||
when: on_success
|
||||
|
||||
end-to-end-tests:
|
||||
docker:
|
||||
- image: circleci/node:12-browsers
|
||||
executor: e2e
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: /tmp/workspace
|
||||
@@ -813,9 +803,9 @@ jobs:
|
||||
name: Install Go linters
|
||||
command: |
|
||||
pushd /tmp
|
||||
VERSION=1.27.0
|
||||
VERSION=1.28.0
|
||||
curl -fLO https://github.com/golangci/golangci-lint/releases/download/v${VERSION}/golangci-lint-${VERSION}-linux-amd64.tar.gz
|
||||
echo 8d345e4e88520e21c113d81978e89ad77fc5b13bfdf20e5bca86b83fc4261272 \
|
||||
echo 179d34edf4baf6454a7081fbaaf74dc99397a3be8e1a535dee04d835a977bf76 \
|
||||
golangci-lint-${VERSION}-linux-amd64.tar.gz | sha256sum --check --strict --status
|
||||
tar -xf golangci-lint-${VERSION}-linux-amd64.tar.gz
|
||||
sudo mv golangci-lint-${VERSION}-linux-amd64/golangci-lint /usr/local/bin/
|
||||
@@ -826,8 +816,9 @@ jobs:
|
||||
command: |
|
||||
# To save memory, run in two batches
|
||||
golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E deadcode -E depguard -E dogsled \
|
||||
-E errcheck -E goconst -E golint -E gosec -E gosimple -E govet -E scopelint ./pkg/...
|
||||
golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E ineffassign \
|
||||
-E errcheck -E goconst -E golint -E gosec -E gosimple -E govet -E exportloopref -E whitespace \
|
||||
-E goprintffuncname ./pkg/...
|
||||
golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E ineffassign -E gocritic -E nakedret \
|
||||
-E rowserrcheck -E staticcheck -E structcheck -E typecheck -E unconvert -E unused -E varcheck ./pkg/...
|
||||
./scripts/go/bin/revive -formatter stylish -config ./scripts/go/configs/revive.toml ./pkg/...
|
||||
./scripts/go/bin/revive -formatter stylish -config ./scripts/go/configs/revive-strict.toml \
|
||||
@@ -861,7 +852,8 @@ jobs:
|
||||
- node_modules
|
||||
- run:
|
||||
name: frontend tests
|
||||
command: "./scripts/circle-test-frontend.sh"
|
||||
command: |
|
||||
./scripts/circle-test-frontend.sh
|
||||
- store_test_results:
|
||||
path: reports/junit
|
||||
- run:
|
||||
@@ -925,11 +917,14 @@ jobs:
|
||||
description: "Deploy Grafana master Docker image to Kubernetes"
|
||||
executor: base
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: /tmp/workspace
|
||||
- install-grabpl
|
||||
- run:
|
||||
name: Deploy to Kubernetes
|
||||
command: |
|
||||
/tmp/grabpl deploy-to-k8s $CIRCLE_WORKFLOW_ID
|
||||
cp -r /tmp/workspace/enterprise/dist .
|
||||
/tmp/grabpl deploy-to-k8s
|
||||
|
||||
release-packages:
|
||||
executor: node
|
||||
@@ -1049,39 +1044,39 @@ workflows:
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
edition: oss
|
||||
variant: osx64
|
||||
name: build-oss-backend-osx64
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
edition: oss
|
||||
variant: win64
|
||||
name: build-oss-backend-win64
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
edition: oss
|
||||
variant: linux-x64
|
||||
name: build-oss-backend-linux-x64
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
edition: oss
|
||||
variant: linux-x64-musl
|
||||
name: build-oss-backend-linux-x64-musl
|
||||
requires:
|
||||
- lint-go
|
||||
- build-frontend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-oss-frontend
|
||||
edition: oss
|
||||
- build-plugins:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-oss-plugins
|
||||
edition: oss
|
||||
requires:
|
||||
@@ -1122,39 +1117,39 @@ workflows:
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-backend-osx64
|
||||
edition: enterprise
|
||||
variant: osx64
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-backend-win64
|
||||
edition: enterprise
|
||||
variant: win64
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-backend-linux-x64
|
||||
edition: enterprise
|
||||
variant: linux-x64
|
||||
requires:
|
||||
- lint-go
|
||||
- build-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-backend-linux-x64-musl
|
||||
edition: enterprise
|
||||
variant: linux-x64-musl
|
||||
requires:
|
||||
- lint-go
|
||||
- build-frontend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-frontend
|
||||
edition: enterprise
|
||||
- build-plugins:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-plugins
|
||||
edition: enterprise
|
||||
requires:
|
||||
@@ -1162,31 +1157,31 @@ workflows:
|
||||
- build-release-publisher:
|
||||
filters: *filter-master-or-release
|
||||
- codespell:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
- lint-go:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
- shellcheck:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
- test-backend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- lint-go
|
||||
- test-frontend:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
- mysql-integration-test:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- lint-go
|
||||
- test-backend
|
||||
- test-frontend
|
||||
- postgres-integration-test:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- lint-go
|
||||
- test-backend
|
||||
- test-frontend
|
||||
- package-oss:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- build-oss-backend-armv6
|
||||
- build-oss-backend-armv7
|
||||
@@ -1204,7 +1199,7 @@ workflows:
|
||||
- shellcheck
|
||||
- build-oss-plugins
|
||||
- package-enterprise:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- build-enterprise-backend-armv6
|
||||
- build-enterprise-backend-armv7
|
||||
@@ -1222,11 +1217,11 @@ workflows:
|
||||
- shellcheck
|
||||
- build-enterprise-plugins
|
||||
- build-oss-windows-installer:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- package-oss
|
||||
- build-enterprise-windows-installer:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- package-enterprise
|
||||
- release-next-packages:
|
||||
@@ -1262,12 +1257,12 @@ workflows:
|
||||
- postgres-integration-test
|
||||
- build-release-publisher
|
||||
- publish-storybook:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- test-backend
|
||||
- test-frontend
|
||||
- build-docker-images:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-oss-docker-images
|
||||
edition: oss
|
||||
ubuntu: false
|
||||
@@ -1278,7 +1273,7 @@ workflows:
|
||||
- package-oss
|
||||
- build-oss-windows-installer
|
||||
- build-docker-images:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-oss-ubuntu-docker-images
|
||||
edition: oss
|
||||
ubuntu: true
|
||||
@@ -1289,7 +1284,7 @@ workflows:
|
||||
- package-oss
|
||||
- build-oss-windows-installer
|
||||
- build-docker-images:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-docker-images
|
||||
edition: enterprise
|
||||
ubuntu: false
|
||||
@@ -1300,7 +1295,7 @@ workflows:
|
||||
- package-enterprise
|
||||
- build-enterprise-windows-installer
|
||||
- build-docker-images:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
name: build-enterprise-ubuntu-docker-images
|
||||
edition: enterprise
|
||||
ubuntu: true
|
||||
@@ -1311,14 +1306,9 @@ workflows:
|
||||
- package-enterprise
|
||||
- build-enterprise-windows-installer
|
||||
- end-to-end-tests:
|
||||
filters: *filter-all
|
||||
filters: *filter-master-or-release
|
||||
requires:
|
||||
- package-oss
|
||||
- build-docs-website:
|
||||
filters: *filter-not-release-or-master
|
||||
requires:
|
||||
- mysql-integration-test
|
||||
- postgres-integration-test
|
||||
- deploy-to-kubernetes:
|
||||
filters: *filter-only-master
|
||||
requires:
|
||||
|
||||
5
.drone.star
Normal file
5
.drone.star
Normal file
@@ -0,0 +1,5 @@
|
||||
load('scripts/lib.star', 'pr_pipelines', 'master_pipelines')
|
||||
|
||||
def main(ctx):
|
||||
edition = 'oss'
|
||||
return pr_pipelines(edition=edition) + master_pipelines(edition=edition)
|
||||
546
.drone.yml
Normal file
546
.drone.yml
Normal file
@@ -0,0 +1,546 @@
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: test-pr
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
steps:
|
||||
- name: identify-runner
|
||||
image: alpine:3.12
|
||||
commands:
|
||||
- echo $DRONE_RUNNER_NAME
|
||||
|
||||
- name: initialize
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- curl -fLO https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v$${GRABPL_VERSION}/grabpl
|
||||
- chmod +x grabpl
|
||||
- mkdir -p bin
|
||||
- mv grabpl bin
|
||||
- curl -fLO https://github.com/jwilder/dockerize/releases/download/v$${DOCKERIZE_VERSION}/dockerize-linux-amd64-v$${DOCKERIZE_VERSION}.tar.gz
|
||||
- tar -C bin -xzvf dockerize-linux-amd64-v$${DOCKERIZE_VERSION}.tar.gz
|
||||
- rm dockerize-linux-amd64-v$${DOCKERIZE_VERSION}.tar.gz
|
||||
- yarn install --frozen-lockfile --no-progress
|
||||
environment:
|
||||
DOCKERIZE_VERSION: 0.6.1
|
||||
GRABPL_VERSION: 0.5.8
|
||||
|
||||
- name: lint-backend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- golangci-lint run --config scripts/go/configs/.golangci.toml ./pkg/...
|
||||
- revive -formatter stylish -config scripts/go/configs/revive.toml ./pkg/...
|
||||
- ./scripts/revive-strict
|
||||
environment:
|
||||
CGO_ENABLED: 1
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: codespell
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- "echo -e \"unknwon\nreferer\nerrorstring\neror\niam\" > words_to_ignore.txt"
|
||||
- codespell -I words_to_ignore.txt docs/
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: shellcheck
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- curl -fLO http://storage.googleapis.com/grafana-downloads/ci-dependencies/shellcheck-v$${VERSION}.linux.x86_64.tar.xz
|
||||
- echo $$CHKSUM shellcheck-v$${VERSION}.linux.x86_64.tar.xz | sha512sum --check --strict --status
|
||||
- tar xf shellcheck-v$${VERSION}.linux.x86_64.tar.xz
|
||||
- mv shellcheck-v$${VERSION}/shellcheck /usr/local/bin/
|
||||
- rm -rf shellcheck-v$${VERSION}*
|
||||
- ./bin/grabpl shellcheck
|
||||
environment:
|
||||
CHKSUM: beca3d7819a6bdcfbd044576df4fc284053b48f468b2f03428fe66f4ceb2c05d9b5411357fa15003cb0311406c255084cf7283a3b8fce644c340c2f6aa910b9f
|
||||
VERSION: 0.7.1
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: test-backend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl test-backend
|
||||
- ./bin/grabpl integration-tests
|
||||
depends_on:
|
||||
- initialize
|
||||
- lint-backend
|
||||
|
||||
- name: test-frontend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- yarn run ci:test-frontend
|
||||
environment:
|
||||
TEST_MAX_WORKERS: 50%
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: build-backend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl build-backend --jobs 8 --edition oss --build-id $DRONE_BUILD_NUMBER --variants linux-x64,linux-x64-musl,osx64,win64 --no-pull-enterprise
|
||||
depends_on:
|
||||
- initialize
|
||||
- lint-backend
|
||||
- test-backend
|
||||
|
||||
- name: build-frontend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition oss --build-id $DRONE_BUILD_NUMBER --no-pull-enterprise
|
||||
depends_on:
|
||||
- initialize
|
||||
- test-frontend
|
||||
|
||||
- name: build-plugins
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps
|
||||
depends_on:
|
||||
- initialize
|
||||
- lint-backend
|
||||
|
||||
- name: package
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- . scripts/build/gpg-test-vars.sh && ./bin/grabpl package --jobs 8 --edition oss --build-id $DRONE_BUILD_NUMBER --no-pull-enterprise --variants linux-x64,linux-x64-musl,osx64,win64
|
||||
depends_on:
|
||||
- build-backend
|
||||
- build-frontend
|
||||
- build-plugins
|
||||
- test-backend
|
||||
- test-frontend
|
||||
- codespell
|
||||
- shellcheck
|
||||
|
||||
- name: end-to-end-tests-server
|
||||
image: grafana/build-container:1.2.26
|
||||
detach: true
|
||||
commands:
|
||||
- ./e2e/start-server
|
||||
depends_on:
|
||||
- package
|
||||
|
||||
- name: end-to-end-tests
|
||||
image: grafana/ci-e2e:12.18-1
|
||||
commands:
|
||||
- ./node_modules/.bin/cypress install
|
||||
- ./bin/grabpl e2e-tests
|
||||
environment:
|
||||
HOST: end-to-end-tests-server
|
||||
depends_on:
|
||||
- end-to-end-tests-server
|
||||
|
||||
- name: build-storybook
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- yarn storybook:build
|
||||
depends_on:
|
||||
- package
|
||||
|
||||
- name: build-docs-website
|
||||
image: grafana/docs-base:latest
|
||||
commands:
|
||||
- mkdir -p /hugo/content/docs/grafana
|
||||
- cp -r docs/sources /hugo/content/docs/grafana/latest
|
||||
- cd /hugo && make prod
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: copy-packages-for-docker
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- cp dist/*.tar.gz packaging/docker/
|
||||
depends_on:
|
||||
- package
|
||||
|
||||
- name: build-docker-images
|
||||
image: grafana/drone-grafana-docker:0.2.0
|
||||
settings:
|
||||
archs: amd64
|
||||
dry_run: true
|
||||
edition: oss
|
||||
depends_on:
|
||||
- copy-packages-for-docker
|
||||
|
||||
- name: postgres-integration-tests
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -yq postgresql-client
|
||||
- ./bin/dockerize -wait tcp://postgres:5432 -timeout 120s
|
||||
- psql -p 5432 -h postgres -U grafanatest -d grafanatest -f devenv/docker/blocks/postgres_tests/setup.sql
|
||||
- go clean -testcache
|
||||
- ./bin/grabpl integration-tests --database postgres
|
||||
environment:
|
||||
GRAFANA_TEST_DB: postgres
|
||||
PGPASSWORD: grafanatest
|
||||
POSTGRES_HOST: postgres
|
||||
depends_on:
|
||||
- test-backend
|
||||
- test-frontend
|
||||
|
||||
- name: mysql-integration-tests
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -yq default-mysql-client
|
||||
- ./bin/dockerize -wait tcp://mysql:3306 -timeout 120s
|
||||
- cat devenv/docker/blocks/mysql_tests/setup.sql | mysql -h mysql -P 3306 -u root -prootpass
|
||||
- go clean -testcache
|
||||
- ./bin/grabpl integration-tests --database mysql
|
||||
environment:
|
||||
GRAFANA_TEST_DB: mysql
|
||||
MYSQL_HOST: mysql
|
||||
depends_on:
|
||||
- test-backend
|
||||
- test-frontend
|
||||
|
||||
services:
|
||||
- name: postgres
|
||||
image: postgres:12.3-alpine
|
||||
environment:
|
||||
POSTGRES_DB: grafanatest
|
||||
POSTGRES_PASSWORD: grafanatest
|
||||
POSTGRES_USER: grafanatest
|
||||
|
||||
- name: mysql
|
||||
image: mysql:5.6.48
|
||||
environment:
|
||||
MYSQL_DATABASE: grafana_tests
|
||||
MYSQL_PASSWORD: password
|
||||
MYSQL_ROOT_PASSWORD: rootpass
|
||||
MYSQL_USER: grafana
|
||||
|
||||
trigger:
|
||||
event:
|
||||
- pull_request
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: test-master
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
|
||||
steps:
|
||||
- name: identify-runner
|
||||
image: alpine:3.12
|
||||
commands:
|
||||
- echo $DRONE_RUNNER_NAME
|
||||
|
||||
- name: initialize
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- curl -fLO https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v$${GRABPL_VERSION}/grabpl
|
||||
- chmod +x grabpl
|
||||
- mkdir -p bin
|
||||
- mv grabpl bin
|
||||
- curl -fLO https://github.com/jwilder/dockerize/releases/download/v$${DOCKERIZE_VERSION}/dockerize-linux-amd64-v$${DOCKERIZE_VERSION}.tar.gz
|
||||
- tar -C bin -xzvf dockerize-linux-amd64-v$${DOCKERIZE_VERSION}.tar.gz
|
||||
- rm dockerize-linux-amd64-v$${DOCKERIZE_VERSION}.tar.gz
|
||||
- yarn install --frozen-lockfile --no-progress
|
||||
environment:
|
||||
DOCKERIZE_VERSION: 0.6.1
|
||||
GRABPL_VERSION: 0.5.8
|
||||
|
||||
- name: lint-backend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- golangci-lint run --config scripts/go/configs/.golangci.toml ./pkg/...
|
||||
- revive -formatter stylish -config scripts/go/configs/revive.toml ./pkg/...
|
||||
- ./scripts/revive-strict
|
||||
environment:
|
||||
CGO_ENABLED: 1
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: codespell
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- "echo -e \"unknwon\nreferer\nerrorstring\neror\niam\" > words_to_ignore.txt"
|
||||
- codespell -I words_to_ignore.txt docs/
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: shellcheck
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- curl -fLO http://storage.googleapis.com/grafana-downloads/ci-dependencies/shellcheck-v$${VERSION}.linux.x86_64.tar.xz
|
||||
- echo $$CHKSUM shellcheck-v$${VERSION}.linux.x86_64.tar.xz | sha512sum --check --strict --status
|
||||
- tar xf shellcheck-v$${VERSION}.linux.x86_64.tar.xz
|
||||
- mv shellcheck-v$${VERSION}/shellcheck /usr/local/bin/
|
||||
- rm -rf shellcheck-v$${VERSION}*
|
||||
- ./bin/grabpl shellcheck
|
||||
environment:
|
||||
CHKSUM: beca3d7819a6bdcfbd044576df4fc284053b48f468b2f03428fe66f4ceb2c05d9b5411357fa15003cb0311406c255084cf7283a3b8fce644c340c2f6aa910b9f
|
||||
VERSION: 0.7.1
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: test-backend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl test-backend
|
||||
- ./bin/grabpl integration-tests
|
||||
depends_on:
|
||||
- initialize
|
||||
- lint-backend
|
||||
|
||||
- name: test-frontend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- yarn run ci:test-frontend
|
||||
environment:
|
||||
TEST_MAX_WORKERS: 50%
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: frontend-metrics
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./scripts/ci-frontend-metrics.sh | ./bin/grabpl publish-metrics $${GRAFANA_MISC_STATS_API_KEY}
|
||||
environment:
|
||||
GRAFANA_MISC_STATS_API_KEY:
|
||||
from_secret: grafana_misc_stats_api_key
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: build-backend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl build-backend --jobs 8 --edition oss --build-id $DRONE_BUILD_NUMBER --no-pull-enterprise
|
||||
depends_on:
|
||||
- initialize
|
||||
- lint-backend
|
||||
- test-backend
|
||||
|
||||
- name: build-frontend
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition oss --build-id $DRONE_BUILD_NUMBER --no-pull-enterprise
|
||||
depends_on:
|
||||
- initialize
|
||||
- test-frontend
|
||||
|
||||
- name: build-plugins
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps
|
||||
depends_on:
|
||||
- initialize
|
||||
- lint-backend
|
||||
|
||||
- name: package
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- . scripts/build/gpg-test-vars.sh && ./bin/grabpl package --jobs 8 --edition oss --build-id $DRONE_BUILD_NUMBER --no-pull-enterprise
|
||||
depends_on:
|
||||
- build-backend
|
||||
- build-frontend
|
||||
- build-plugins
|
||||
- test-backend
|
||||
- test-frontend
|
||||
- codespell
|
||||
- shellcheck
|
||||
|
||||
- name: end-to-end-tests-server
|
||||
image: grafana/build-container:1.2.26
|
||||
detach: true
|
||||
commands:
|
||||
- ./e2e/start-server
|
||||
depends_on:
|
||||
- package
|
||||
|
||||
- name: end-to-end-tests
|
||||
image: grafana/ci-e2e:12.18-1
|
||||
commands:
|
||||
- ./node_modules/.bin/cypress install
|
||||
- ./bin/grabpl e2e-tests
|
||||
environment:
|
||||
HOST: end-to-end-tests-server
|
||||
depends_on:
|
||||
- end-to-end-tests-server
|
||||
|
||||
- name: build-storybook
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- yarn storybook:build
|
||||
depends_on:
|
||||
- package
|
||||
|
||||
- name: publish-storybook
|
||||
image: grafana/grafana-ci-deploy:1.2.6
|
||||
commands:
|
||||
- printenv GCP_KEY | base64 -d > /tmp/gcpkey.json
|
||||
- gcloud auth activate-service-account --key-file=/tmp/gcpkey.json
|
||||
- echo gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://grafana-storybook/canary
|
||||
environment:
|
||||
GCP_KEY:
|
||||
from_secret: gcp_key
|
||||
depends_on:
|
||||
- build-storybook
|
||||
|
||||
- name: build-docs-website
|
||||
image: grafana/docs-base:latest
|
||||
commands:
|
||||
- mkdir -p /hugo/content/docs/grafana
|
||||
- cp -r docs/sources /hugo/content/docs/grafana/latest
|
||||
- cd /hugo && make prod
|
||||
depends_on:
|
||||
- initialize
|
||||
|
||||
- name: copy-packages-for-docker
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- cp dist/*.tar.gz packaging/docker/
|
||||
depends_on:
|
||||
- package
|
||||
|
||||
- name: build-docker-images
|
||||
image: grafana/drone-grafana-docker:0.2.0
|
||||
settings:
|
||||
dry_run: true
|
||||
edition: oss
|
||||
depends_on:
|
||||
- copy-packages-for-docker
|
||||
|
||||
- name: build-docker-images-ubuntu
|
||||
image: grafana/drone-grafana-docker:0.2.0
|
||||
settings:
|
||||
dry_run: true
|
||||
edition: oss
|
||||
ubuntu: true
|
||||
depends_on:
|
||||
- copy-packages-for-docker
|
||||
|
||||
- name: postgres-integration-tests
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -yq postgresql-client
|
||||
- ./bin/dockerize -wait tcp://postgres:5432 -timeout 120s
|
||||
- psql -p 5432 -h postgres -U grafanatest -d grafanatest -f devenv/docker/blocks/postgres_tests/setup.sql
|
||||
- go clean -testcache
|
||||
- ./bin/grabpl integration-tests --database postgres
|
||||
environment:
|
||||
GRAFANA_TEST_DB: postgres
|
||||
PGPASSWORD: grafanatest
|
||||
POSTGRES_HOST: postgres
|
||||
depends_on:
|
||||
- test-backend
|
||||
- test-frontend
|
||||
|
||||
- name: mysql-integration-tests
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -yq default-mysql-client
|
||||
- ./bin/dockerize -wait tcp://mysql:3306 -timeout 120s
|
||||
- cat devenv/docker/blocks/mysql_tests/setup.sql | mysql -h mysql -P 3306 -u root -prootpass
|
||||
- go clean -testcache
|
||||
- ./bin/grabpl integration-tests --database mysql
|
||||
environment:
|
||||
GRAFANA_TEST_DB: mysql
|
||||
MYSQL_HOST: mysql
|
||||
depends_on:
|
||||
- test-backend
|
||||
- test-frontend
|
||||
|
||||
- name: release-next-npm-packages
|
||||
image: grafana/build-container:1.2.26
|
||||
commands:
|
||||
- npx lerna bootstrap
|
||||
- echo "//registry.npmjs.org/:_authToken=$${NPM_TOKEN}" >> ~/.npmrc
|
||||
- echo ./scripts/circle-release-next-packages.sh
|
||||
environment:
|
||||
NPM_TOKEN:
|
||||
from_secret: npm_token
|
||||
depends_on:
|
||||
- end-to-end-tests
|
||||
|
||||
- name: publish-packages
|
||||
image: grafana/grafana-ci-deploy:1.2.6
|
||||
commands:
|
||||
- echo ./bin/grabpl publish-packages --edition oss
|
||||
depends_on:
|
||||
- package
|
||||
- end-to-end-tests
|
||||
- mysql-integration-tests
|
||||
- postgres-integration-tests
|
||||
|
||||
services:
|
||||
- name: postgres
|
||||
image: postgres:12.3-alpine
|
||||
environment:
|
||||
POSTGRES_DB: grafanatest
|
||||
POSTGRES_PASSWORD: grafanatest
|
||||
POSTGRES_USER: grafanatest
|
||||
|
||||
- name: mysql
|
||||
image: mysql:5.6.48
|
||||
environment:
|
||||
MYSQL_DATABASE: grafana_tests
|
||||
MYSQL_PASSWORD: password
|
||||
MYSQL_ROOT_PASSWORD: rootpass
|
||||
MYSQL_USER: grafana
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
event:
|
||||
- push
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: windows-installer-master
|
||||
|
||||
platform:
|
||||
os: windows
|
||||
arch: amd64
|
||||
version: 1809
|
||||
|
||||
steps:
|
||||
- name: identify-runner
|
||||
image: mcr.microsoft.com/windows:1809
|
||||
commands:
|
||||
- echo $Env:DRONE_RUNNER_NAME
|
||||
|
||||
- name: build-windows-installer
|
||||
image: grafana/ci-wix:0.1.1
|
||||
commands:
|
||||
- $$gcpKey = $$env:GCP_KEY
|
||||
- "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($$gcpKey)) > gcpkey.json"
|
||||
- dos2unix gcpkey.json
|
||||
- gcloud auth activate-service-account --key-file=gcpkey.json
|
||||
- rm gcpkey.json
|
||||
- $$ProgressPreference = "SilentlyContinue"
|
||||
- Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v0.5.8/windows/grabpl.exe -OutFile grabpl.exe
|
||||
- Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/oss/master/grafana-7.2.0-9fffe273pre.windows-amd64.zip -OutFile grafana.zip
|
||||
- cp C:\App\nssm-2.24.zip .
|
||||
- ./grabpl.exe windows-installer --edition oss grafana.zip
|
||||
- $$fname = ((Get-Childitem grafana*.msi -name) -split "`n")[0]
|
||||
- echo "gsutil cp $$fname gs://grafana-downloads/oss/master/"
|
||||
- echo "gsutil cp $$fname.sha256 gs://grafana-downloads/oss/master/"
|
||||
environment:
|
||||
GCP_KEY:
|
||||
from_secret: gcp_key
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
event:
|
||||
- push
|
||||
|
||||
depends_on:
|
||||
- test-master
|
||||
|
||||
...
|
||||
@@ -25,3 +25,6 @@ trim_trailing_whitespace = false
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
indent_size = 2
|
||||
|
||||
[*.star]
|
||||
indent_size = 4
|
||||
|
||||
11
.eslintrc
11
.eslintrc
@@ -1,4 +1,13 @@
|
||||
{
|
||||
"extends": ["@grafana/eslint-config"],
|
||||
"root": true
|
||||
"root": true,
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["packages/**/*.{ts,tsx}", "public/app/**/*.{ts,tsx}"],
|
||||
"rules": {
|
||||
"react-hooks/rules-of-hooks": "off",
|
||||
"react-hooks/exhaustive-deps": "off"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
@@ -12,8 +12,8 @@
|
||||
# This should make it easy to add new rules without breaking existing ones.
|
||||
|
||||
# Documentation owner: Diana Payton
|
||||
/docs/ @oddlittlebird
|
||||
/contribute/ @oddlittlebird @marcusolsson
|
||||
/docs/ @oddlittlebird @achatterjee-grafana
|
||||
/contribute/ @oddlittlebird @marcusolsson @achatterjee-grafana
|
||||
|
||||
|
||||
# Backend code
|
||||
|
||||
39
.github/ISSUE_TEMPLATE/4-grafana_ui_component.md
vendored
Normal file
39
.github/ISSUE_TEMPLATE/4-grafana_ui_component.md
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
name: '@grafana/ui component request'
|
||||
about: Suggest a component for the @grafana/ui package
|
||||
labels: 'area/grafana/ui'
|
||||
---
|
||||
|
||||
<!--
|
||||
By using this template you will make it easier for us to make sure that documentation and implementation stays up to date for every component in @grafana/ui
|
||||
|
||||
Thank you!
|
||||
-->
|
||||
|
||||
**Why is this component needed**:
|
||||
<!-- Explain your use case -->
|
||||
___
|
||||
- [ ] Is/could it be used in more than one place in Grafana?
|
||||
|
||||
**Where is/could it be used?**:
|
||||
|
||||
___
|
||||
- [ ] Post screenshots possible.
|
||||
- [ ] It has a single use case.
|
||||
- [ ] It is/could be used in multiple places.
|
||||
|
||||
**Implementation** (Checklist meant for the person implementing the component)
|
||||
|
||||
- [ ] Component has a story in Storybook.
|
||||
- [ ] Props and naming follows [our style guide](https://github.com/grafana/grafana/blob/master/contribute/style-guides/frontend.md).
|
||||
- [ ] It is extendable (rest props are spread, styles with className work, and so on).
|
||||
- [ ] Uses [theme for spacing, colors, and so on](https://github.com/grafana/grafana/blob/master/contribute/style-guides/themes.md).
|
||||
- [ ] Works with both light and dark theme.
|
||||
|
||||
**Documentation**
|
||||
|
||||
- [ ] Properties are documented.
|
||||
- [ ] Use cases are described.
|
||||
- [ ] Code examples for the different use cases.
|
||||
- [ ] Dos and don'ts.
|
||||
- [ ] Styling guidelines, specific color usage (if applicable).
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -15,7 +15,6 @@ awsconfig
|
||||
.yarnrc
|
||||
.yarn/
|
||||
vendor/
|
||||
.eslintcache
|
||||
|
||||
# Enterprise emails
|
||||
/emails/templates/enterprise_*
|
||||
|
||||
235
CHANGELOG.md
235
CHANGELOG.md
@@ -1,3 +1,222 @@
|
||||
# 7.2.0-beta1 (unreleased)
|
||||
|
||||
### Breaking changes
|
||||
|
||||
* **Units**: The date time units `YYYY-MM-DD HH:mm:ss` and `MM/DD/YYYY h:mm:ss a` have been renamed to `Datetime ISO`
|
||||
and `Datetime US` respectively. This is no breaking change just a visual name change (the unit id is unchanged). The
|
||||
unit behavior is different however, it no longer hides the date part if the date is today. If you want this old
|
||||
behavior you need to change unit to `Datetime ISO (No date if today)` or `Datetime US (No date if today)`.
|
||||
|
||||
# 7.1.5 (2020-08-25)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Stats**: Stop counting the same user multiple times. [#26777](https://github.com/grafana/grafana/pull/26777), [@sakjur](https://github.com/sakjur)
|
||||
|
||||
### Bug Fixes
|
||||
* **Alerting**: remove LongToWide call in alerting. [#27140](https://github.com/grafana/grafana/pull/27140), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **AzureMonitor**: fix panic introduced in 7.1.4 when unit was unspecified and alias was used. [#27113](https://github.com/grafana/grafana/pull/27113), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Variables**: Fixes issue with All variable not being resolved. [#27151](https://github.com/grafana/grafana/pull/27151), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
|
||||
# 7.1.4 (2020-08-20)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Azure App Insights Alert error - tsdb.HandleRequest() failed to convert dataframe "" to tsdb.TimeSeriesSlice**. [#26897](https://github.com/grafana/grafana/issues/26897)
|
||||
* **AzureMonitor**: map more units. [#26990](https://github.com/grafana/grafana/pull/26990), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Azuremonitor**: do not set unit if literal "Unspecified". [#26839](https://github.com/grafana/grafana/pull/26839), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Dataframe/Alerting**: to tsdb.TimeSeriesSlice - accept "empty" time series. [#26903](https://github.com/grafana/grafana/pull/26903), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Field overrides**: Filter by field name using regex. [#27070](https://github.com/grafana/grafana/pull/27070), [@dprokop](https://github.com/dprokop)
|
||||
* **Overrides**: expose byType matcher UI. [#27056](https://github.com/grafana/grafana/pull/27056), [@ryantxu](https://github.com/ryantxu)
|
||||
|
||||
### Bug Fixes
|
||||
* **CloudWatch**: Add FreeStorageCapacity metric. [#26503](https://github.com/grafana/grafana/pull/26503), [@waqark3389](https://github.com/waqark3389)
|
||||
* **CloudWatch**: Fix sorting of metrics results. [#26835](https://github.com/grafana/grafana/pull/26835), [@aknuds1](https://github.com/aknuds1)
|
||||
* **Cloudwatch**: Add FileSystemId as a dimension key for the AWS/FSx namespace. [#26662](https://github.com/grafana/grafana/pull/26662), [@waqark3389](https://github.com/waqark3389)
|
||||
* **InfluxDB**: Update Flux placeholder URL with respect to latest Go client. [#27086](https://github.com/grafana/grafana/pull/27086), [@aknuds1](https://github.com/aknuds1)
|
||||
* **InfluxDB**: Upgrade Go client, use data source HTTP client. [#27012](https://github.com/grafana/grafana/pull/27012), [@aknuds1](https://github.com/aknuds1)
|
||||
* **Proxy**: Fix updating refresh token in OAuth pass-thru. [#26885](https://github.com/grafana/grafana/pull/26885), [@seanlaff](https://github.com/seanlaff)
|
||||
* **Templating**: Fixes so texts show in picker not the values. [#27002](https://github.com/grafana/grafana/pull/27002), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
|
||||
# 7.1.3 (2020-08-06)
|
||||
|
||||
### Bug Fixes
|
||||
* **Templating**: Templating: Fix undefined result when using raw interpolation format [#26818](https://github.com/grafana/grafana/pull/26818)
|
||||
|
||||
# 7.1.2 (2020-08-05)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Explore**: Don't run queries on datasource change. [#26033](https://github.com/grafana/grafana/pull/26033), [@davkal](https://github.com/davkal)
|
||||
* **TemplateSrv**: Formatting options for ${__from} and ${__to}, unix seconds epoch, ISO 8601/RFC 3339. [#26466](https://github.com/grafana/grafana/pull/26466), [@torkelo](https://github.com/torkelo)
|
||||
* **Toolkit/Plugin**: throw an Error instead of a string. [#26618](https://github.com/grafana/grafana/pull/26618), [@leventebalogh](https://github.com/leventebalogh)
|
||||
|
||||
### Bug Fixes
|
||||
* **Dashbard**: Fix refresh interval settings to allow setting it to equal min_refresh_interval. [#26615](https://github.com/grafana/grafana/pull/26615), [@torkelo](https://github.com/torkelo)
|
||||
* **Flux**: Ensure connections to InfluxDB are closed. [#26735](https://github.com/grafana/grafana/pull/26735), [@sneddrs](https://github.com/sneddrs)
|
||||
* **Query history**: Fix search filtering if null value. [#26768](https://github.com/grafana/grafana/pull/26768), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **QueryOptions**: Fix not being able to change cache timeout setting. [#26614](https://github.com/grafana/grafana/pull/26614), [@torkelo](https://github.com/torkelo)
|
||||
* **StatPanel**: Fix stat panel display name not showing when explicitly set. [#26616](https://github.com/grafana/grafana/pull/26616), [@torkelo](https://github.com/torkelo)
|
||||
* **Templating**: Fixed access to system variables like __dashboard, __user & __org during dashboard load & variable queries. [#26637](https://github.com/grafana/grafana/pull/26637), [@torkelo](https://github.com/torkelo)
|
||||
* **TextPanel**: Fix content overflowing panel boundaries. [#26612](https://github.com/grafana/grafana/pull/26612), [@torkelo](https://github.com/torkelo)
|
||||
* **TimePicker**: Fix position and responsive behavior. [#26570](https://github.com/grafana/grafana/pull/26570), [@torkelo](https://github.com/torkelo)
|
||||
* **TimePicker**: Fixes app crash when changing custom range to nothing. [#26775](https://github.com/grafana/grafana/pull/26775), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **Units**: Remove duplicate SI prefix from mSv and µSv. [#26598](https://github.com/grafana/grafana/pull/26598), [@tofurky](https://github.com/tofurky)
|
||||
|
||||
# 7.1.1 (2020-07-24)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Graph**: Support setting field unit & override data source (automatic) unit. [#26529](https://github.com/grafana/grafana/pull/26529), [@ryantxu](https://github.com/ryantxu)
|
||||
* **Tracing**: Add errorIconColor prop to TraceSpanData. [#26509](https://github.com/grafana/grafana/pull/26509), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||
|
||||
### Bug Fixes
|
||||
* **Branding**: Fix login app title. [#26425](https://github.com/grafana/grafana/pull/26425), [@benrubson](https://github.com/benrubson)
|
||||
* **Bring back scripts evaluation in TextPanel**. [#26413](https://github.com/grafana/grafana/pull/26413), [@dprokop](https://github.com/dprokop)
|
||||
* **Dashboard**: Fix empty panels after scrolling on Safari/iOS. [#26495](https://github.com/grafana/grafana/pull/26495), [@torkelo](https://github.com/torkelo)
|
||||
* **Dashboard**: Fix for viewer can enter panel edit mode by modifying url (but cannot not save anything). [#26556](https://github.com/grafana/grafana/pull/26556), [@torkelo](https://github.com/torkelo)
|
||||
* **Elasticsearch**: Fix displaying of bucket script input. [#26552](https://github.com/grafana/grafana/pull/26552), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore**: parse queryType from explore url. [#26349](https://github.com/grafana/grafana/pull/26349), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||
* **Tracing**: upstream fix for hovering on log lines. [#26426](https://github.com/grafana/grafana/pull/26426), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||
|
||||
# 7.1.0 (2020-07-16)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Backend**: Use latest go plugin sdk (0.74.0) to sort wide frames. [#26207](https://github.com/grafana/grafana/pull/26207), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Elasticsearch**: Create Raw Doc metric to render raw JSON docs in columns in the new table panel. [#26233](https://github.com/grafana/grafana/pull/26233), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **PluginsListPage**: More plugins button should open in new window. [#26305](https://github.com/grafana/grafana/pull/26305), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||
|
||||
### Bug Fixes
|
||||
* **AdminUsers**: Reset page to zero on query change. [#26293](https://github.com/grafana/grafana/pull/26293), [@hshoff](https://github.com/hshoff)
|
||||
* **CloudWatch Logs**: Fixes grouping of results by numeric field. [#26298](https://github.com/grafana/grafana/pull/26298), [@kaydelaney](https://github.com/kaydelaney)
|
||||
* **DashboardLinks**: Do not over-query search endpoint. [#26311](https://github.com/grafana/grafana/pull/26311), [@torkelo](https://github.com/torkelo)
|
||||
* **Docker**: Make sure to create default plugin provisioning directory. [#26017](https://github.com/grafana/grafana/pull/26017), [@marefr](https://github.com/marefr)
|
||||
* **Elastic**: Fix error "e.buckets[Symbol.iterator] is not a function" when using filter. [#26217](https://github.com/grafana/grafana/pull/26217), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore/Loki**: Escape \ in labels for show context queries. [#26116](https://github.com/grafana/grafana/pull/26116), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Jaeger/Zipkin**: URL-encode service names and trace ids for API calls. [#26115](https://github.com/grafana/grafana/pull/26115), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Prometheus**: Fix prom links in mixed mode. [#26244](https://github.com/grafana/grafana/pull/26244), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||
* **Provisioning**: Fix bug when provision app plugins using Enterprise edition. [#26340](https://github.com/grafana/grafana/pull/26340), [@marefr](https://github.com/marefr)
|
||||
* **Sign In** Use correct url for the Sign In button. [#26239](https://github.com/grafana/grafana/pull/26239), [@dprokop](https://github.com/dprokop)
|
||||
|
||||
# 7.1.0-beta3 (2020-07-13)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Explore**: Unification of logs/metrics/traces user interface. [#25890](https://github.com/grafana/grafana/pull/25890), [@aocenas](https://github.com/aocenas)
|
||||
* **Graph panel**: Move Stacking and null values before Hover tooltip options (#26035). [#26037](https://github.com/grafana/grafana/pull/26037), [@jsoref](https://github.com/jsoref)
|
||||
* **LDAP**: Get all groups for all group base search DNs. [#25825](https://github.com/grafana/grafana/pull/25825), [@Annegies](https://github.com/Annegies)
|
||||
* **Table**: JSON Cell should try to convert strings to JSON. [#26024](https://github.com/grafana/grafana/pull/26024), [@ryantxu](https://github.com/ryantxu)
|
||||
* **Transform**: adding missing "table"-transform and "series to rows"-transform to Grafana v7-transforms. [#26042](https://github.com/grafana/grafana/pull/26042), [@mckn](https://github.com/mckn)
|
||||
|
||||
### Bug Fixes
|
||||
* **AdminUsersTable**: Fix width issues. [#26019](https://github.com/grafana/grafana/pull/26019), [@tskarhed](https://github.com/tskarhed)
|
||||
* **BarGauge**: Fix space bug in single series mode. [#26176](https://github.com/grafana/grafana/pull/26176), [@torkelo](https://github.com/torkelo)
|
||||
* **Dashboard**: Allow removing min refresh interval from refresh options (5s or other). [#26150](https://github.com/grafana/grafana/pull/26150), [@torkelo](https://github.com/torkelo)
|
||||
* **DataLinks**: Fixed interpolation of repeated variables used in Graph data links. [#26147](https://github.com/grafana/grafana/pull/26147), [@torkelo](https://github.com/torkelo)
|
||||
* **Do not break dashboard settings UI when time intervals end with trailing comma**. [#26126](https://github.com/grafana/grafana/pull/26126), [@dprokop](https://github.com/dprokop)
|
||||
* **Elastic**: Display correct log message based on selected log field. [#26020](https://github.com/grafana/grafana/pull/26020), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **InfluxDB**: Fixed new group by dropdown now showing after first use. [#26031](https://github.com/grafana/grafana/pull/26031), [@torkelo](https://github.com/torkelo)
|
||||
* **StatPanel**: Fixes issue with name showing for single series / field results. [#26070](https://github.com/grafana/grafana/pull/26070), [@torkelo](https://github.com/torkelo)
|
||||
* **Templating**: Fix recursive loop of template variable queries when changing ad-hoc-variable. [#26191](https://github.com/grafana/grafana/pull/26191), [@torkelo](https://github.com/torkelo)
|
||||
|
||||
# 7.0.6 (2020-07-09)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
* **Templating**: Fixed recursive queries triggered when switching dashboard settings view [#26137](https://github.com/grafana/grafana/pull/26137)
|
||||
* **Templating**: Fix recursive loop of template variable queries when changing ad-hoc-variable [#26191](https://github.com/grafana/grafana/pull/26191)
|
||||
* **Auth**: Add support for forcing authentication in anonymous mode and modify SignIn to use it instead of redirect [#25567](https://github.com/grafana/grafana/pull/25567)
|
||||
* **Auth**: Fix POST request failures with anonymous access [#26049](https://github.com/grafana/grafana/pull/26049)
|
||||
|
||||
# 7.1.0-beta 2 (2020-07-02)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Loki**: Allow aliasing Loki queries in dashboard. [#25706](https://github.com/grafana/grafana/pull/25706), [@bastjan](https://github.com/bastjan)
|
||||
|
||||
### Bug Fixes
|
||||
* **Explore**: Fix href when jumping from Explore to Add data source. [#25991](https://github.com/grafana/grafana/pull/25991), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Fix**: Build-in plugins failed to load in windows. [#25982](https://github.com/grafana/grafana/pull/25982), [@papagian](https://github.com/papagian)
|
||||
|
||||
# 7.1.0-beta 1 (2020-07-01)
|
||||
|
||||
### Features / Enhancements
|
||||
* **Alerting**: Adds support for multiple URLs in Alertmanager notifier. [#24196](https://github.com/grafana/grafana/pull/24196), [@alistarle](https://github.com/alistarle)
|
||||
* **Alerting**: updating the victorops alerter to handle the no_data alert type. [#23761](https://github.com/grafana/grafana/pull/23761), [@rrusso1982](https://github.com/rrusso1982)
|
||||
* **Azure**: Application Insights metrics to Frame and support multiple query dimensions. [#25849](https://github.com/grafana/grafana/pull/25849), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Azure**: Multiple dimension support for Azure Monitor Service. [#25947](https://github.com/grafana/grafana/pull/25947), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Azure**: Split Insights into two services. [#25410](https://github.com/grafana/grafana/pull/25410), [@kylebrandt](https://github.com/kylebrandt)
|
||||
* **Backend plugins**: Refactor to allow shared contract between core and external backend plugins. [#25472](https://github.com/grafana/grafana/pull/25472), [@marefr](https://github.com/marefr)
|
||||
* **Branding**: Use AppTitle as document title. [#25271](https://github.com/grafana/grafana/pull/25271), [@benrubson](https://github.com/benrubson)
|
||||
* **Chore**: upgrade to typescript 3.9.3. [#25154](https://github.com/grafana/grafana/pull/25154), [@ryantxu](https://github.com/ryantxu)
|
||||
* **CloudWatch**: Add Route53 DNSQueries metric and dimension. [#25125](https://github.com/grafana/grafana/pull/25125), [@erkolson](https://github.com/erkolson)
|
||||
* **CloudWatch**: Added AWS DataSync metrics and dimensions. [#25054](https://github.com/grafana/grafana/pull/25054), [@ilyastoli](https://github.com/ilyastoli)
|
||||
* **CloudWatch**: Added AWS MediaStore metrics and dimensions. [#25492](https://github.com/grafana/grafana/pull/25492), [@ilyastoli](https://github.com/ilyastoli)
|
||||
* **CloudWatch**: Added AWS RoboMaker metrics and dimensions. [#25090](https://github.com/grafana/grafana/pull/25090), [@ilyastoli](https://github.com/ilyastoli)
|
||||
* **CloudWatch**: Added AWS SDKMetrics metrics and dimensions. [#25150](https://github.com/grafana/grafana/pull/25150), [@ilyastoli](https://github.com/ilyastoli)
|
||||
* **CloudWatch**: Added AWS ServiceCatalog metrics and dimensions. [#25812](https://github.com/grafana/grafana/pull/25812), [@ilyastoli](https://github.com/ilyastoli)
|
||||
* **CloudWatch**: Added AWS WAFV2 metrics. [#24048](https://github.com/grafana/grafana/pull/24048), [@mikkokupsu](https://github.com/mikkokupsu)
|
||||
* **Dashboards**: Make path to default dashboard configurable. [#25595](https://github.com/grafana/grafana/pull/25595), [@bergquist](https://github.com/bergquist)
|
||||
* **Elastic**: Internal data links. [#25942](https://github.com/grafana/grafana/pull/25942), [@aocenas](https://github.com/aocenas)
|
||||
* **Elasticsearch**: Add support for template variable in date histogram min_doc_count. [#21064](https://github.com/grafana/grafana/pull/21064), [@faxm0dem](https://github.com/faxm0dem)
|
||||
* **Elasticsearch**: Adds cumulative sum aggregation support. [#24820](https://github.com/grafana/grafana/pull/24820), [@retzkek](https://github.com/retzkek)
|
||||
* **Elasticsearch**: Support using a variable for histogram and terms min doc count. [#25392](https://github.com/grafana/grafana/pull/25392), [@marefr](https://github.com/marefr)
|
||||
* **Explore/Loki**: Show results of instant queries only in table and time series only in graph. [#25845](https://github.com/grafana/grafana/pull/25845), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore**: Remove legend formatting when switching from panel to Explore. [#25848](https://github.com/grafana/grafana/pull/25848), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Footer**: Add back footer to login page. [#25656](https://github.com/grafana/grafana/pull/25656), [@torkelo](https://github.com/torkelo)
|
||||
* **ForgottenPassword**: Move view to login screen. [#25366](https://github.com/grafana/grafana/pull/25366), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Gauge**: Hide orientation option in panel options. [#25511](https://github.com/grafana/grafana/pull/25511), [@torkelo](https://github.com/torkelo)
|
||||
* **Grafana-UI**: Add FileUpload. [#25835](https://github.com/grafana/grafana/pull/25835), [@Clarity-89](https://github.com/Clarity-89)
|
||||
* **GraphPanel**: Make legend values clickable series toggles. [#25581](https://github.com/grafana/grafana/pull/25581), [@hshoff](https://github.com/hshoff)
|
||||
* **Influx**: Support flux in the influx datasource. [#25308](https://github.com/grafana/grafana/pull/25308), [@ryantxu](https://github.com/ryantxu)
|
||||
* **Migration**: Select org. [#24739](https://github.com/grafana/grafana/pull/24739), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Migration**: Settings forms. [#24741](https://github.com/grafana/grafana/pull/24741), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Panel Inspect**: use Monaco editor for json display. [#25251](https://github.com/grafana/grafana/pull/25251), [@ryantxu](https://github.com/ryantxu)
|
||||
* **Panel edit**: Clicking twice on a visualization closes the VizPicker. [#25739](https://github.com/grafana/grafana/pull/25739), [@peterholmberg](https://github.com/peterholmberg)
|
||||
* **PanelInspect**: Update UI for Data display options. [#25478](https://github.com/grafana/grafana/pull/25478), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Plugins**: move jaeger trace type to grafana data. [#25403](https://github.com/grafana/grafana/pull/25403), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||
* **Provisioning**: Adds support for enabling app plugins. [#25649](https://github.com/grafana/grafana/pull/25649), [@marefr](https://github.com/marefr)
|
||||
* **Provisioning**: Use folders structure from the file system to create desired folders in dashboard provisioning. [#23117](https://github.com/grafana/grafana/pull/23117), [@nabokihms](https://github.com/nabokihms)
|
||||
* **Query history**: Add keyboard shortcut support for commenting. [#24736](https://github.com/grafana/grafana/pull/24736), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Query history**: Add search for query history and starred queries. [#25747](https://github.com/grafana/grafana/pull/25747), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Rich history**: Updates for default settings and starred queries deletion. [#25732](https://github.com/grafana/grafana/pull/25732), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Search**: support URL query params. [#25541](https://github.com/grafana/grafana/pull/25541), [@Clarity-89](https://github.com/Clarity-89)
|
||||
* **Stackdriver**: Deep linking from Grafana panels to the Metrics Explorer. [#25858](https://github.com/grafana/grafana/pull/25858), [@papagian](https://github.com/papagian)
|
||||
* **Stackdriver**: Rename Stackdriver to Google Cloud Monitoring. [#25807](https://github.com/grafana/grafana/pull/25807), [@papagian](https://github.com/papagian)
|
||||
* **StatPanel**: Option showing name instead of value and more. [#25676](https://github.com/grafana/grafana/pull/25676), [@torkelo](https://github.com/torkelo)
|
||||
* **Switch**: Deprecate checked prop in favor of value. [#25862](https://github.com/grafana/grafana/pull/25862), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Tab**: Make active tab clickable and add hyperlink functionality. [#25546](https://github.com/grafana/grafana/pull/25546), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Table**: Adds adhoc filtering. [#25467](https://github.com/grafana/grafana/pull/25467), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **Teams**: Add index for permission check. [#25736](https://github.com/grafana/grafana/pull/25736), [@sakjur](https://github.com/sakjur)
|
||||
* **Template variable filters**: Hide overflowing text. [#25801](https://github.com/grafana/grafana/pull/25801), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Templating**: Add bult in __user {name, id, login, email} variable to templating system. [#23378](https://github.com/grafana/grafana/pull/23378), [@aidanmountford](https://github.com/aidanmountford)
|
||||
* **Templating**: removes old Angular variable system and featureToggle. [#24779](https://github.com/grafana/grafana/pull/24779), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **TextPanel**: Adds proper editor for markdown and html. [#25618](https://github.com/grafana/grafana/pull/25618), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **TextPanel**: Removes Angular Text Panel. [#25504](https://github.com/grafana/grafana/pull/25504), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **TextPanel**: Removes text mode. [#25589](https://github.com/grafana/grafana/pull/25589), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **TimeZone**: unify the time zone pickers to one that can rule them all. [#24803](https://github.com/grafana/grafana/pull/24803), [@mckn](https://github.com/mckn)
|
||||
* **Transform**: added merge transform that will merge multiple series/tables into one table. [#25490](https://github.com/grafana/grafana/pull/25490), [@mckn](https://github.com/mckn)
|
||||
* **Units**: add base-pascals and rotational speed units. [#22879](https://github.com/grafana/grafana/pull/22879), [@sakjur](https://github.com/sakjur)
|
||||
* **Units**: add new unit for duration, it is optimized for displaying days, hours, minutes and seconds. [#24175](https://github.com/grafana/grafana/pull/24175), [@pabigot](https://github.com/pabigot)
|
||||
* **Variables**: enables cancel for slow query variables queries. [#24430](https://github.com/grafana/grafana/pull/24430), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **switches default value for security settings**. [#25175](https://github.com/grafana/grafana/pull/25175), [@bergquist](https://github.com/bergquist)
|
||||
* **Reporting:** add monthly schedule option. (Enterprise)
|
||||
|
||||
### Bug Fixes
|
||||
* **DatatLinks**: Fix open in new tab state mismatch. [#25826](https://github.com/grafana/grafana/pull/25826), [@tskarhed](https://github.com/tskarhed)
|
||||
* **Explore/Loki**: Fix field type in table for instant queries. [#25907](https://github.com/grafana/grafana/pull/25907), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore/Loki**: Fix scrolling of context when leaving context window. [#25838](https://github.com/grafana/grafana/pull/25838), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore/SQL data sources**: Show correctly interpolated queries. [#25110](https://github.com/grafana/grafana/pull/25110), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore/Tooltip**: Fix label value in tooltip. [#25940](https://github.com/grafana/grafana/pull/25940), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore**: Fix query editors on mobile. [#25148](https://github.com/grafana/grafana/pull/25148), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||
* **Explore**: adds an ability to exit log row context with ESC key. [#24205](https://github.com/grafana/grafana/pull/24205), [@Estrax](https://github.com/Estrax)
|
||||
* **Fix**: Value mappings match against string values. [#25929](https://github.com/grafana/grafana/pull/25929), [@peterholmberg](https://github.com/peterholmberg)
|
||||
* **GraphPanel**: Fix annotations overflowing panels. [#25606](https://github.com/grafana/grafana/pull/25606), [@hshoff](https://github.com/hshoff)
|
||||
* **Instrumentation**: Fix setting Jaeger tracing address through Grafana config. [#25768](https://github.com/grafana/grafana/pull/25768), [@marefr](https://github.com/marefr)
|
||||
* **Prometheus**: Fix performance issue in processing of histogram labels. [#25813](https://github.com/grafana/grafana/pull/25813), [@bsherrod](https://github.com/bsherrod)
|
||||
* **Provisioning**: Makes file the default dashboard provisioner type. [#24856](https://github.com/grafana/grafana/pull/24856), [@bergquist](https://github.com/bergquist)
|
||||
* **Templating**: fixes variables not being interpolated after dashboard refresh. [#25698](https://github.com/grafana/grafana/pull/25698), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
* **Units**: Custom unit suffix and docs for custom units. [#25710](https://github.com/grafana/grafana/pull/25710), [@torkelo](https://github.com/torkelo)
|
||||
* **ValueFormats**: Fix byte-format data rates. [#25424](https://github.com/grafana/grafana/pull/25424), [@mueslo](https://github.com/mueslo)
|
||||
* **Variables**: Fixes maximum call stack bug for empty value. [#25503](https://github.com/grafana/grafana/pull/25503), [@hugohaggmark](https://github.com/hugohaggmark)
|
||||
|
||||
### Security fixes
|
||||
* **Graph**: Fix XSS vulnerability with series overrides [#25401](https://github.com/grafana/grafana/pull/25401). Thanks to Rotem Reiss for reporting this.
|
||||
|
||||
# 7.0.5 (2020-06-30)
|
||||
|
||||
### Bug Fixes
|
||||
@@ -1895,7 +2114,7 @@ See [security announcement](https://community.grafana.com/t/grafana-5-3-3-and-4-
|
||||
- **Docker**: Make it possible to set a specific plugin url [#12861](https://github.com/grafana/grafana/pull/12861), thx [ClementGautier](https://github.com/ClementGautier)
|
||||
- **GrafanaCli**: Fixed issue with grafana-cli install plugin resulting in corrupt http response from source error. Fixes [#13079](https://github.com/grafana/grafana/issues/13079)
|
||||
- **Provisioning**: Should allow one default data source per organization [#12229](https://github.com/grafana/grafana/issues/12229)
|
||||
- **Github OAuth**: Allow changes of user info at Github to be synched to Grafana when signing in [#11818](https://github.com/grafana/grafana/issues/11818), thx [@rwaweber](https://github.com/rwaweber)
|
||||
- **GitHub OAuth**: Allow changes of user info at GitHub to be synched to Grafana when signing in [#11818](https://github.com/grafana/grafana/issues/11818), thx [@rwaweber](https://github.com/rwaweber)
|
||||
- **OAuth**: Fix overriding tls_skip_verify_insecure using environment variable [#12747](https://github.com/grafana/grafana/issues/12747), thx [@jangaraj](https://github.com/jangaraj)
|
||||
- **Prometheus**: Fix graph panel bar width issue in aligned prometheus queries [#12379](https://github.com/grafana/grafana/issues/12379)
|
||||
- **Prometheus**: Heatmap - fix unhandled error when some points are missing [#12484](https://github.com/grafana/grafana/issues/12484)
|
||||
@@ -2210,7 +2429,7 @@ See [security announcement](https://community.grafana.com/t/grafana-5-2-3-and-4-
|
||||
|
||||
### Fixes
|
||||
|
||||
- **oauth** Fix Github OAuth not working with private Organizations [#11028](https://github.com/grafana/grafana/pull/11028) [@lostick](https://github.com/lostick)
|
||||
- **oauth** Fix GitHub OAuth not working with private Organizations [#11028](https://github.com/grafana/grafana/pull/11028) [@lostick](https://github.com/lostick)
|
||||
- **kiosk** white area over bottom panels in kiosk mode [#11010](https://github.com/grafana/grafana/issues/11010)
|
||||
- **alerting** Fix OK state doesn't show up in Microsoft Teams [#11032](https://github.com/grafana/grafana/pull/11032), thx [@manacker](https://github.com/manacker)
|
||||
|
||||
@@ -2222,7 +2441,7 @@ See [security announcement](https://community.grafana.com/t/grafana-5-2-3-and-4-
|
||||
- **Folders** Make it easier/explicit to access/modify folders using the API [#10630](https://github.com/grafana/grafana/issues/10630)
|
||||
- **Dashboard** Scrollbar works incorrectly in Grafana 5.0 Beta4 in some cases [#10982](https://github.com/grafana/grafana/issues/10982)
|
||||
- **ElasticSearch** Custom aggregation sizes no longer allowed for Elasticsearch [#10124](https://github.com/grafana/grafana/issues/10124)
|
||||
- **oauth** Github OAuth with allowed organizations fails to login [#10964](https://github.com/grafana/grafana/issues/10964)
|
||||
- **oauth** GitHub OAuth with allowed organizations fails to login [#10964](https://github.com/grafana/grafana/issues/10964)
|
||||
- **heatmap** Heatmap panel has partially hidden legend [#10793](https://github.com/grafana/grafana/issues/10793)
|
||||
- **snapshots** Expired snapshots not being cleaned up [#10996](https://github.com/grafana/grafana/pull/10996)
|
||||
|
||||
@@ -2255,7 +2474,7 @@ See [security announcement](https://community.grafana.com/t/grafana-5-2-3-and-4-
|
||||
- **Light theme** Fixed problem with light theme in safari, [#10869](https://github.com/grafana/grafana/issues/10869)
|
||||
- **Provisioning** Now handles deletes when dashboard json files removed from disk [#10865](https://github.com/grafana/grafana/issues/10865)
|
||||
- **MySQL** Fixed issue with schema migration on old mysql (index too long) [#10779](https://github.com/grafana/grafana/issues/10779)
|
||||
- **Github OAuth** Fixed fetching github orgs from private github org [#10823](https://github.com/grafana/grafana/issues/10823)
|
||||
- **GitHub OAuth** Fixed fetching github orgs from private github org [#10823](https://github.com/grafana/grafana/issues/10823)
|
||||
- **Embedding** Fixed issues embedding panel [#10787](https://github.com/grafana/grafana/issues/10787)
|
||||
|
||||
# 5.0.0-beta1 (2018-02-05)
|
||||
@@ -2314,7 +2533,7 @@ Dashboard panels and rows are positioned using a gridPos object `{x: 0, y: 0, w:
|
||||
- **Dashboard**: Make it possible to start dashboards from search and dashboard list panel [#1871](https://github.com/grafana/grafana/issues/1871)
|
||||
- **Annotations**: Posting annotations now return the id of the annotation [#9798](https://github.com/grafana/grafana/issues/9798)
|
||||
- **Systemd**: Use systemd notification ready flag [#10024](https://github.com/grafana/grafana/issues/10024), thx [@jgrassler](https://github.com/jgrassler)
|
||||
- **Github**: Use organizations_url provided from github to verify user belongs in org. [#10111](https://github.com/grafana/grafana/issues/10111), thx
|
||||
- **GitHub**: Use organizations_url provided from github to verify user belongs in org. [#10111](https://github.com/grafana/grafana/issues/10111), thx
|
||||
[@adiletmaratov](https://github.com/adiletmaratov)
|
||||
- **Backend**: Fixed bug where Grafana exited before all sub routines where finished [#10131](https://github.com/grafana/grafana/issues/10131)
|
||||
- **Azure**: Adds support for Azure blob storage as external image stor [#8955](https://github.com/grafana/grafana/issues/8955), thx [@saada](https://github.com/saada)
|
||||
@@ -3321,8 +3540,8 @@ Grunt & Watch tasks:
|
||||
|
||||
- [Issue #2218](https://github.com/grafana/grafana/issues/2218). Auth: You can now authenticate against api with username / password using basic auth
|
||||
- [Issue #2095](https://github.com/grafana/grafana/issues/2095). Search: Search now supports filtering by multiple dashboard tags
|
||||
- [Issue #1905](https://github.com/grafana/grafana/issues/1905). Github OAuth: You can now configure a Github team membership requirement, thx @dewski
|
||||
- [Issue #2052](https://github.com/grafana/grafana/issues/2052). Github OAuth: You can now configure a Github organization requirement, thx @indrekj
|
||||
- [Issue #1905](https://github.com/grafana/grafana/issues/1905). GitHub OAuth: You can now configure a GitHub team membership requirement, thx @dewski
|
||||
- [Issue #2052](https://github.com/grafana/grafana/issues/2052). GitHub OAuth: You can now configure a GitHub organization requirement, thx @indrekj
|
||||
- [Issue #1891](https://github.com/grafana/grafana/issues/1891). Security: New config option to disable the use of gravatar for profile images
|
||||
- [Issue #1921](https://github.com/grafana/grafana/issues/1921). Auth: Support for user authentication via reverse proxy header (like X-Authenticated-User, or X-WEBAUTH-USER)
|
||||
- [Issue #960](https://github.com/grafana/grafana/issues/960). Search: Backend can now index a folder with json files, will be available in search (saving back to folder is not supported, this feature is meant for static generated json dashboards)
|
||||
@@ -3364,7 +3583,7 @@ Grunt & Watch tasks:
|
||||
- [Issue #1749](https://github.com/grafana/grafana/issues/1749). Graph Panel: Table legends are now visible when rendered to PNG
|
||||
- [Issue #1786](https://github.com/grafana/grafana/issues/1786). Graph Panel: Legend in table mode now aligns, graph area is reduced depending on how many series
|
||||
- [Issue #1734](https://github.com/grafana/grafana/issues/1734). Support for unicode / international characters in dashboard title (improved slugify)
|
||||
- [Issue #1782](https://github.com/grafana/grafana/issues/1782). Github OAuth: Now works with Github for Enterprise, thanks @williamjoy
|
||||
- [Issue #1782](https://github.com/grafana/grafana/issues/1782). GitHub OAuth: Now works with GitHub for Enterprise, thanks @williamjoy
|
||||
- [Issue #1780](https://github.com/grafana/grafana/issues/1780). Dashboard snapshot: Should not require login to view snapshot, Fixes #1780
|
||||
|
||||
# 2.0.0-Beta3 (2015-04-12)
|
||||
|
||||
@@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@grafana.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at conduct@grafana.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:12.18.1-alpine3.12 as js-builder
|
||||
FROM node:12.18.3-alpine3.12 as js-builder
|
||||
|
||||
WORKDIR /usr/src/app/
|
||||
|
||||
@@ -16,7 +16,7 @@ COPY emails emails
|
||||
ENV NODE_ENV production
|
||||
RUN ./node_modules/.bin/grunt build
|
||||
|
||||
FROM golang:1.14.4-alpine3.12 as go-builder
|
||||
FROM golang:1.15.1-alpine3.12 as go-builder
|
||||
|
||||
RUN apk add --no-cache gcc g++
|
||||
|
||||
@@ -50,7 +50,7 @@ ENV PATH="/usr/share/grafana/bin:$PATH" \
|
||||
WORKDIR $GF_PATHS_HOME
|
||||
|
||||
RUN apk add --no-cache ca-certificates bash tzdata && \
|
||||
apk add --no-cache --upgrade openssl musl-utils
|
||||
apk add --no-cache openssl musl-utils
|
||||
|
||||
COPY conf ./conf
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:12.16.3-slim AS js-builder
|
||||
FROM node:12.18.3-slim AS js-builder
|
||||
|
||||
WORKDIR /usr/src/app/
|
||||
|
||||
@@ -16,7 +16,7 @@ COPY emails emails
|
||||
ENV NODE_ENV production
|
||||
RUN ./node_modules/.bin/grunt build
|
||||
|
||||
FROM golang:1.14.2 AS go-builder
|
||||
FROM golang:1.15.1 AS go-builder
|
||||
|
||||
WORKDIR /src/grafana
|
||||
|
||||
@@ -50,7 +50,7 @@ WORKDIR $GF_PATHS_HOME
|
||||
COPY conf conf
|
||||
|
||||
# curl should be part of the image
|
||||
RUN apt-get update && apt-get upgrade -y && apt-get install -y ca-certificates curl
|
||||
RUN apt-get update && apt-get install -y ca-certificates curl
|
||||
|
||||
RUN mkdir -p "$GF_PATHS_HOME/.aws" && \
|
||||
addgroup --system --gid $GF_GID grafana && \
|
||||
@@ -66,7 +66,6 @@ RUN mkdir -p "$GF_PATHS_HOME/.aws" && \
|
||||
chown -R grafana:grafana "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \
|
||||
chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING"
|
||||
|
||||
|
||||
COPY --from=go-builder /src/grafana/bin/linux-amd64/grafana-server /src/grafana/bin/linux-amd64/grafana-cli bin/
|
||||
COPY --from=js-builder /usr/src/app/public public
|
||||
COPY --from=js-builder /usr/src/app/tools tools
|
||||
|
||||
18
Gruntfile.js
18
Gruntfile.js
@@ -1,5 +1,5 @@
|
||||
'use strict';
|
||||
module.exports = function (grunt) {
|
||||
module.exports = function(grunt) {
|
||||
var os = require('os');
|
||||
var config = {
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
@@ -47,18 +47,20 @@ module.exports = function (grunt) {
|
||||
|
||||
// Utility function to load plugin settings into config
|
||||
function loadConfig(config, path) {
|
||||
require('glob').sync('*', {cwd: path}).forEach(function(option) {
|
||||
var key = option.replace(/\.js$/,'');
|
||||
// If key already exists, extend it. It is your responsibility to avoid naming collisions
|
||||
config[key] = config[key] || {};
|
||||
grunt.util._.extend(config[key], require(path + option)(config,grunt));
|
||||
});
|
||||
require('glob')
|
||||
.sync('*', { cwd: path })
|
||||
.forEach(function(option) {
|
||||
var key = option.replace(/\.js$/, '');
|
||||
// If key already exists, extend it. It is your responsibility to avoid naming collisions
|
||||
config[key] = config[key] || {};
|
||||
grunt.util._.extend(config[key], require(path + option)(config, grunt));
|
||||
});
|
||||
// technically not required
|
||||
return config;
|
||||
}
|
||||
|
||||
// Merge that object with what with whatever we have here
|
||||
loadConfig(config,'./scripts/grunt/options/');
|
||||
loadConfig(config, './scripts/grunt/options/');
|
||||
// pass the config to grunt
|
||||
grunt.initConfig(config);
|
||||
};
|
||||
|
||||
@@ -327,14 +327,14 @@ This will give you a structure of labels in the sidebar similar to the following
|
||||
```
|
||||
- Inbox
|
||||
...
|
||||
- Github (mine)
|
||||
- GitHub (mine)
|
||||
- activity
|
||||
- assigned
|
||||
- mentions
|
||||
- Github (other)
|
||||
- GitHub (other)
|
||||
- Grafana
|
||||
```
|
||||
|
||||
* All notifications you’ll need to read/take action on show up as unread in Github (mine) and its sub-labels.
|
||||
* All other notifications you don’t need to take action on show up as unread in Github (other) and its sub-labels
|
||||
* All notifications you’ll need to read/take action on show up as unread in GitHub (mine) and its sub-labels.
|
||||
* All other notifications you don’t need to take action on show up as unread in GitHub (other) and its sub-labels
|
||||
* This is convenient for issue triage and to follow the activity in the Grafana project.
|
||||
|
||||
11
Makefile
11
Makefile
@@ -83,16 +83,7 @@ revive: scripts/go/bin/revive
|
||||
|
||||
revive-strict: scripts/go/bin/revive
|
||||
@echo "lint via revive (strict)"
|
||||
@scripts/go/bin/revive \
|
||||
-formatter stylish \
|
||||
-config ./scripts/go/configs/revive-strict.toml \
|
||||
-exclude ./pkg/plugins/backendplugin/pluginextensionv2/... \
|
||||
./pkg/services/alerting/... \
|
||||
./pkg/services/provisioning/datasources/... \
|
||||
./pkg/services/provisioning/dashboards/... \
|
||||
./pkg/services/provisioning/notifiers/... \
|
||||
./pkg/services/provisioning/values/... \
|
||||
./pkg/plugins/backendplugin/...
|
||||
@scripts/revive-strict scripts/go/bin/revive
|
||||
|
||||
scripts/go/bin/golangci-lint: scripts/go/go.mod
|
||||
@cd scripts/go; \
|
||||
|
||||
@@ -279,11 +279,11 @@ editors_can_admin = false
|
||||
# Login cookie name
|
||||
login_cookie_name = grafana_session
|
||||
|
||||
# The lifetime (days) an authenticated user can be inactive before being required to login at next visit. Default is 7 days.
|
||||
login_maximum_inactive_lifetime_days = 7
|
||||
# The maximum lifetime (duration) an authenticated user can be inactive before being required to login at next visit. Default is 7 days (7d). This setting should be expressed as a duration, e.g. 5m (minutes), 6h (hours), 10d (days), 2w (weeks), 1M (month). The lifetime resets at each successful token rotation (token_rotation_interval_minutes).
|
||||
login_maximum_inactive_lifetime_duration =
|
||||
|
||||
# The maximum lifetime (days) an authenticated user can be logged in since login time before being required to login. Default is 30 days.
|
||||
login_maximum_lifetime_days = 30
|
||||
# The maximum lifetime (duration) an authenticated user can be logged in since login time before being required to login. Default is 30 days (30d). This setting should be expressed as a duration, e.g. 5m (minutes), 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
login_maximum_lifetime_duration =
|
||||
|
||||
# How often should auth tokens be rotated for authenticated users when being active. The default is each 10 minutes.
|
||||
token_rotation_interval_minutes = 10
|
||||
@@ -301,8 +301,8 @@ signout_redirect_url =
|
||||
# This setting is ignored if multiple OAuth providers are configured.
|
||||
oauth_auto_login = false
|
||||
|
||||
# OAuth state max age cookie duration. Defaults to 60 seconds.
|
||||
oauth_state_cookie_max_age = 60
|
||||
# OAuth state max age cookie duration in seconds. Defaults to 600 seconds.
|
||||
oauth_state_cookie_max_age = 600
|
||||
|
||||
# limit of api_key seconds to live before expiration
|
||||
api_key_max_seconds_to_live = -1
|
||||
@@ -321,12 +321,12 @@ org_role = Viewer
|
||||
# mask the Grafana version number for unauthenticated users
|
||||
hide_version = false
|
||||
|
||||
#################################### Github Auth #########################
|
||||
#################################### GitHub Auth #########################
|
||||
[auth.github]
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_id
|
||||
client_secret = some_secret
|
||||
client_secret =
|
||||
scopes = user:email,read:org
|
||||
auth_url = https://github.com/login/oauth/authorize
|
||||
token_url = https://github.com/login/oauth/access_token
|
||||
@@ -340,7 +340,7 @@ allowed_organizations =
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_id
|
||||
client_secret = some_secret
|
||||
client_secret =
|
||||
scopes = api
|
||||
auth_url = https://gitlab.com/oauth/authorize
|
||||
token_url = https://gitlab.com/oauth/token
|
||||
@@ -353,7 +353,7 @@ allowed_groups =
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_client_id
|
||||
client_secret = some_client_secret
|
||||
client_secret =
|
||||
scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
|
||||
auth_url = https://accounts.google.com/o/oauth2/auth
|
||||
token_url = https://accounts.google.com/o/oauth2/token
|
||||
@@ -367,7 +367,7 @@ hosted_domain =
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_id
|
||||
client_secret = some_secret
|
||||
client_secret =
|
||||
scopes = user:email
|
||||
allowed_organizations =
|
||||
|
||||
@@ -375,7 +375,7 @@ allowed_organizations =
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_id
|
||||
client_secret = some_secret
|
||||
client_secret =
|
||||
scopes = user:email
|
||||
allowed_organizations =
|
||||
|
||||
@@ -385,7 +385,7 @@ name = Azure AD
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_client_id
|
||||
client_secret = some_client_secret
|
||||
client_secret =
|
||||
scopes = openid email profile
|
||||
auth_url = https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize
|
||||
token_url = https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token
|
||||
@@ -398,7 +398,7 @@ name = Okta
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_id
|
||||
client_secret = some_secret
|
||||
client_secret =
|
||||
scopes = openid profile email groups
|
||||
auth_url = https://<tenant-id>.okta.com/oauth2/v1/authorize
|
||||
token_url = https://<tenant-id>.okta.com/oauth2/v1/token
|
||||
@@ -413,11 +413,13 @@ name = OAuth
|
||||
enabled = false
|
||||
allow_sign_up = true
|
||||
client_id = some_id
|
||||
client_secret = some_secret
|
||||
client_secret =
|
||||
scopes = user:email
|
||||
email_attribute_name = email:primary
|
||||
email_attribute_path =
|
||||
login_attribute_path =
|
||||
role_attribute_path =
|
||||
id_token_attribute_name =
|
||||
auth_url =
|
||||
token_url =
|
||||
api_url =
|
||||
@@ -597,6 +599,36 @@ max_attempts = 3
|
||||
# Makes it possible to enforce a minimal interval between evaluations, to reduce load on the backend
|
||||
min_interval_seconds = 1
|
||||
|
||||
# Configures for how long alert annotations are stored. Default is 0, which keeps them forever.
|
||||
# This setting should be expressed as an duration. Ex 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
max_annotation_age =
|
||||
|
||||
# Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations.
|
||||
max_annotations_to_keep =
|
||||
|
||||
#################################### Annotations #########################
|
||||
|
||||
[annotations.dashboard]
|
||||
# Dashboard annotations means that annotations are associated with the dashboard they are created on.
|
||||
|
||||
# Configures how long dashboard annotations are stored. Default is 0, which keeps them forever.
|
||||
# This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
max_age =
|
||||
|
||||
# Configures max number of dashboard annotations that Grafana stores. Default value is 0, which keeps all dashboard annotations.
|
||||
max_annotations_to_keep =
|
||||
|
||||
[annotations.api]
|
||||
# API annotations means that the annotations have been created using the API without any
|
||||
# association with a dashboard.
|
||||
|
||||
# Configures how long Grafana stores API annotations. Default is 0, which keeps them forever.
|
||||
# This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
max_age =
|
||||
|
||||
# Configures max number of API annotations that Grafana keeps. Default value is 0, which keeps all API annotations.
|
||||
max_annotations_to_keep =
|
||||
|
||||
#################################### Explore #############################
|
||||
[explore]
|
||||
# Enable the Explore section
|
||||
@@ -675,6 +707,8 @@ public_url =
|
||||
key_file =
|
||||
bucket =
|
||||
path =
|
||||
enable_signed_urls = false
|
||||
signed_url_expiration =
|
||||
|
||||
[external_image_storage.azure_blob]
|
||||
account_name =
|
||||
@@ -771,3 +805,23 @@ license_path =
|
||||
[feature_toggles]
|
||||
# enable features, separated by spaces
|
||||
enable =
|
||||
|
||||
[date_formats]
|
||||
# For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/
|
||||
|
||||
# Default system date format used in time range picker and other places where full time is displayed
|
||||
full_date = YYYY-MM-DD HH:mm:ss
|
||||
|
||||
# Used by graph and other places where we only show small intervals
|
||||
interval_second = HH:mm:ss
|
||||
interval_minute = HH:mm
|
||||
interval_hour = MM/DD HH:mm
|
||||
interval_day = MM/DD
|
||||
interval_month = YYYY-MM
|
||||
interval_year = YYYY
|
||||
|
||||
# Experimental feature
|
||||
use_browser_locale = false
|
||||
|
||||
# Default timezone for user preferences. Options are 'browser' for the browser local timezone or a timezone name from IANA Time Zone database, e.g. 'UTC' or 'Europe/Amsterdam' etc.
|
||||
default_timezone = browser
|
||||
|
||||
@@ -278,11 +278,11 @@
|
||||
# Login cookie name
|
||||
;login_cookie_name = grafana_session
|
||||
|
||||
# The lifetime (days) an authenticated user can be inactive before being required to login at next visit. Default is 7 days,
|
||||
;login_maximum_inactive_lifetime_days = 7
|
||||
# The maximum lifetime (duration) an authenticated user can be inactive before being required to login at next visit. Default is 7 days (7d). This setting should be expressed as a duration, e.g. 5m (minutes), 6h (hours), 10d (days), 2w (weeks), 1M (month). The lifetime resets at each successful token rotation
|
||||
;login_maximum_inactive_lifetime_duration =
|
||||
|
||||
# The maximum lifetime (days) an authenticated user can be logged in since login time before being required to login. Default is 30 days.
|
||||
;login_maximum_lifetime_days = 30
|
||||
# The maximum lifetime (duration) an authenticated user can be logged in since login time before being required to login. Default is 30 days (30d). This setting should be expressed as a duration, e.g. 5m (minutes), 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
;login_maximum_lifetime_duration =
|
||||
|
||||
# How often should auth tokens be rotated for authenticated users when being active. The default is each 10 minutes.
|
||||
;token_rotation_interval_minutes = 10
|
||||
@@ -300,8 +300,8 @@
|
||||
# This setting is ignored if multiple OAuth providers are configured.
|
||||
;oauth_auto_login = false
|
||||
|
||||
# OAuth state max age cookie duration. Defaults to 60 seconds.
|
||||
;oauth_state_cookie_max_age = 60
|
||||
# OAuth state max age cookie duration in seconds. Defaults to 600 seconds.
|
||||
;oauth_state_cookie_max_age = 600
|
||||
|
||||
# limit of api_key seconds to live before expiration
|
||||
;api_key_max_seconds_to_live = -1
|
||||
@@ -320,7 +320,7 @@
|
||||
# mask the Grafana version number for unauthenticated users
|
||||
;hide_version = false
|
||||
|
||||
#################################### Github Auth ##########################
|
||||
#################################### GitHub Auth ##########################
|
||||
[auth.github]
|
||||
;enabled = false
|
||||
;allow_sign_up = true
|
||||
@@ -407,6 +407,8 @@
|
||||
;scopes = user:email,read:org
|
||||
;email_attribute_name = email:primary
|
||||
;email_attribute_path =
|
||||
;login_attribute_path =
|
||||
;id_token_attribute_name =
|
||||
;auth_url = https://foo.bar/login/oauth/authorize
|
||||
;token_url = https://foo.bar/login/oauth/access_token
|
||||
;api_url = https://foo.bar/user
|
||||
@@ -589,6 +591,36 @@
|
||||
# Makes it possible to enforce a minimal interval between evaluations, to reduce load on the backend
|
||||
;min_interval_seconds = 1
|
||||
|
||||
# Configures for how long alert annotations are stored. Default is 0, which keeps them forever.
|
||||
# This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
;max_annotation_age =
|
||||
|
||||
# Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations.
|
||||
;max_annotations_to_keep =
|
||||
|
||||
#################################### Annotations #########################
|
||||
|
||||
[annotations.dashboard]
|
||||
# Dashboard annotations means that annotations are associated with the dashboard they are created on.
|
||||
|
||||
# Configures how long dashboard annotations are stored. Default is 0, which keeps them forever.
|
||||
# This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
;max_age =
|
||||
|
||||
# Configures max number of dashboard annotations that Grafana stores. Default value is 0, which keeps all dashboard annotations.
|
||||
;max_annotations_to_keep =
|
||||
|
||||
[annotations.api]
|
||||
# API annotations means that the annotations have been created using the API without any
|
||||
# association with a dashboard.
|
||||
|
||||
# Configures how long Grafana stores API annotations. Default is 0, which keeps them forever.
|
||||
# This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
;max_age =
|
||||
|
||||
# Configures max number of API annotations that Grafana keeps. Default value is 0, which keeps all API annotations.
|
||||
;max_annotations_to_keep =
|
||||
|
||||
#################################### Explore #############################
|
||||
[explore]
|
||||
# Enable the Explore section
|
||||
@@ -762,3 +794,23 @@
|
||||
[feature_toggles]
|
||||
# enable features, separated by spaces
|
||||
;enable =
|
||||
|
||||
[date_formats]
|
||||
# For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/
|
||||
|
||||
# Default system date format used in time range picker and other places where full time is displayed
|
||||
;full_date = YYYY-MM-DD HH:mm:ss
|
||||
|
||||
# Used by graph and other places where we only show small intervals
|
||||
;interval_second = HH:mm:ss
|
||||
;interval_minute = HH:mm
|
||||
;interval_hour = MM/DD HH:mm
|
||||
;interval_day = MM/DD
|
||||
;interval_month = YYYY-MM
|
||||
;interval_year = YYYY
|
||||
|
||||
# Experimental feature
|
||||
;use_browser_locale = false
|
||||
|
||||
# Default timezone for user preferences. Options are 'browser' for the browser local timezone or a timezone name from IANA Time Zone database, e.g. 'UTC' or 'Europe/Amsterdam' etc.
|
||||
;default_timezone = browser
|
||||
@@ -27,11 +27,14 @@ npm install -g yarn
|
||||
|
||||
## Download Grafana
|
||||
|
||||
We recommend using Go to download the source code for the Grafana project:
|
||||
We recommend using the Git command-line interface to download the source code for the Grafana project:
|
||||
|
||||
1. Add `export GOPATH=$HOME/go/` to the bottom of your `$HOME/.bash_profile`.
|
||||
1. Open a terminal and run `go get github.com/grafana/grafana` in your terminal. This command downloads, and installs Grafana to your `$GOPATH`.
|
||||
1. Open `$GOPATH/src/github.com/grafana/grafana` in your favorite code editor.
|
||||
1. Open a terminal and run `git clone https://github.com/grafana/grafana.git`. This command downloads Grafana to a new `grafana` directory in your current directory.
|
||||
1. Open the `grafana` directory in your favorite code editor.
|
||||
|
||||
For alternative ways of cloning the Grafana repository, please refer to [GitHub's cloning a repository](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) documentation.
|
||||
|
||||
**Warning:** Do not use `go get` to download Grafana. Recent versions of Go have added behavior which isn't compatible with the way the Grafana repository is structured.
|
||||
|
||||
## Build Grafana
|
||||
|
||||
@@ -125,7 +128,7 @@ yarn e2e:dev
|
||||
|
||||
## Configure Grafana for development
|
||||
|
||||
The default configuration, `grafana.ini`, is located in the `conf` directory.
|
||||
The default configuration, `defaults.ini`, is located in the `conf` directory.
|
||||
|
||||
To override the default configuration, create a `custom.ini` file in the `conf` directory. You only need to add the options you wish to override.
|
||||
|
||||
@@ -184,7 +187,7 @@ Are you having issues with setting up your environment? Here are some tips that
|
||||
|
||||
### Too many open files when running `make run`
|
||||
|
||||
Depending on your environment, you may have to increase the maximum number of open files allowed. For the rest of this section, we will assume you are on a Unix like OS (e.g. Linux/MacOS), where you can control the maximum number of open files through the [ulimit](https://ss64.com/bash/ulimit.html) shell command.
|
||||
Depending on your environment, you may have to increase the maximum number of open files allowed. For the rest of this section, we will assume you are on a Unix like OS (e.g. Linux/macOS), where you can control the maximum number of open files through the [ulimit](https://ss64.com/bash/ulimit.html) shell command.
|
||||
|
||||
To see how many open files are allowed, run:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Backend style guide
|
||||
|
||||
Grafanas backend has been developed for a long time with a mix of code styles. This guide explains how we want to write Go code in the future.
|
||||
Grafana's backend has been developed for a long time with a mix of code styles. This guide explains how we want to write Go code in the future.
|
||||
|
||||
Unless stated otherwise, use the guidelines listed in the following articles:
|
||||
|
||||
|
||||
@@ -22,11 +22,11 @@ Start your document with a single ``#`` for the title of the page. Add the sub-h
|
||||
|
||||
* Make text **bold** using two asterisks.
|
||||
|
||||
**Example:** It is ``**important**`` to use Github Flavored Markdown emoji consistently.
|
||||
**Example:** It is ``**important**`` to use GitHub Flavored Markdown emoji consistently.
|
||||
|
||||
* Make text ``*emphasized*`` using single `` _underscores_`` or a single asterisk.
|
||||
|
||||
**Example:** Github Flavored Markdown emoji should _only_ appear in specific cases.
|
||||
**Example:** GitHub Flavored Markdown emoji should _only_ appear in specific cases.
|
||||
|
||||
|
||||
## Links and references
|
||||
@@ -36,7 +36,7 @@ the web URL in curved brackets.
|
||||
|
||||
\[text to display](www.website.com)
|
||||
|
||||
**Example:** For more information on including emoji in Github flavored Markdown, refer to the [webfx page on emoji](https://www.webfx.com/tools/emoji-cheat-sheet/) for a list of emoji.
|
||||
**Example:** For more information on including emoji in GitHub flavored Markdown, refer to the [webfx page on emoji](https://www.webfx.com/tools/emoji-cheat-sheet/) for a list of emoji.
|
||||
|
||||
## Block quotes
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ This style guide applies to all documentation created for Grafana products.
|
||||
|
||||
For information about how to write technical documentation, we suggest reviewing the content of the [Google Technical Writing courses](https://developers.google.com/tech-writing).
|
||||
|
||||
The [Divio documentation system](https://documentation.divio.com/) site is also a good resource.
|
||||
The [Divio documentation system](https://documentation.divio.com/) site and the [Vue writing principles](https://v3.vuejs.org/guide/contributing/writing-guide.html#principles) are also good resources.
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -18,6 +18,32 @@ For all items not covered in this guide, refer to the [Microsoft Style Guide](ht
|
||||
|
||||
The [codespell](https://github.com/codespell-project/codespell) tool is run for every change to catch common misspellings.
|
||||
|
||||
## Inclusive language
|
||||
|
||||
This section provides guidelines on how to avoid using charged language in documentation.
|
||||
|
||||
### Allowing and blocking
|
||||
|
||||
Don't use "whitelist" or "blacklist" when referring to allowing or blocking content or traffic.
|
||||
|
||||
* When used as a noun, use "allowlist" or "blocklist".
|
||||
* When used as a verb, use "allow" or "block"
|
||||
|
||||
Example: _To **allow** outgoing traffic, add the IP to the **allowlist**._
|
||||
|
||||
### Leader and follower
|
||||
|
||||
Don't use "master" or "slave" to describe relationships between nodes or processes.
|
||||
|
||||
* Use "leader", "main" or "primary," instead of "master."
|
||||
* Use "follower" or "secondary," instead of "slave."
|
||||
|
||||
### Exceptions
|
||||
|
||||
When referring to a configuration or settings used by third-party libraries och technologies outside the Grafana project, prefer the original name to avoid confusion.
|
||||
|
||||
For example, use "master" when referring to the default Git branch.
|
||||
|
||||
## Grafana-specific style
|
||||
|
||||
The following sections provide general guidelines on topics specific to Grafana documentation. Note that for the most part, these are *guidelines*, not rigid rules. If you have questions, ask in the #docs channel of Grafana Slack.
|
||||
@@ -31,9 +57,10 @@ The following sections provide general guidelines on topics specific to Grafana
|
||||
* Write in present tense.
|
||||
- Not: The panel will open.
|
||||
- Use: The panel opens. Grafana opens the panel.
|
||||
* Do not use an ampersand (&) as an abbreviation for "and."
|
||||
* Do not use an ampersand (&) as an abbreviation for "and."
|
||||
- **Exceptions:** If an ampersand is used in the Grafana UI, then match the UI.
|
||||
* Avoid using internal slang and jargon in technical documentation.
|
||||
* Do not use two spaces after a period. Only add one space after each sentence. Do not add a space at the end of the paragraph.
|
||||
|
||||
### File naming conventions
|
||||
|
||||
@@ -156,7 +183,7 @@ One word, not two.
|
||||
|
||||
#### open source, open-source
|
||||
|
||||
Do not hyphenate when used as an adjective unless the lack of hyphen would cause confusion. For example: _Open source software design is the most open open-source system I can imagine._
|
||||
Do not hyphenate when used as an adjective unless the lack of hyphen would cause confusion. For example: _Open source software design is the most open open-source system I can imagine._
|
||||
|
||||
Do not hyphenate when it is used as a noun. For example: _Open source is the best way to develop software._
|
||||
|
||||
|
||||
@@ -66,8 +66,8 @@ The next step is to create a `Page` representation in our e2e test framework to
|
||||
|
||||
```typescript
|
||||
export const Login = {
|
||||
url: "/login", // used when called from Login.visit()
|
||||
username: "Username input field", // used when called from Login.username().type('Hello World')
|
||||
url: '/login', // used when called from Login.visit()
|
||||
username: 'Username input field', // used when called from Login.username().type('Hello World')
|
||||
};
|
||||
```
|
||||
|
||||
@@ -186,24 +186,3 @@ describe('List test', () => {
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## Debugging PhantomJS image rendering
|
||||
|
||||
### Common Error
|
||||
|
||||
The most common error with PhantomJs image rendering is when a PR introduces an import that has functionality that's not supported by PhantomJs. To quickly identify which new import causes this you can use a tool like `es-check`.
|
||||
|
||||
1. Run > `npx es-check es5 './public/build/*.js'`
|
||||
2. Check the output for files that break es5 compatibility.
|
||||
3. Lazy load the failing imports if possible.
|
||||
|
||||
### Debugging
|
||||
|
||||
There is no easy or comprehensive way to debug PhantomJS smoke test (image rendering) failures. However, PhantomJS exposes remote debugging interface which can give you a sense of what is going wrong in the smoke test. Before performing the steps described below make sure your local Grafana instance is running:
|
||||
|
||||
1. Go to `tools/phantomjs` directory
|
||||
2. Execute `phantomjs` binary against `render.js` file: `./phantomjs --remote-debugger-port=9009 --remote-debugger-autorun=yes ./render.js url="http://localhost:3000"`
|
||||
3. In your browser navigate to `http://localhost:9009/`
|
||||
4. Select `http://localhost:3000/login` from the list. You will get access to Webkit's inspector to see the console's output from the smoke test.
|
||||
|
||||
The method described above is not perfect, but is helpful to evaluate smoke tests breaking due to bundle errors.
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
apiVersion: 1
|
||||
|
||||
datasources:
|
||||
@@ -226,6 +225,7 @@ datasources:
|
||||
jsonData:
|
||||
authType: credentials
|
||||
defaultRegion: eu-west-2
|
||||
customMetricsNamespaces: "CWAgent"
|
||||
|
||||
# Keep to test old /api/prom API
|
||||
- name: gdev-loki-0.3
|
||||
@@ -270,5 +270,3 @@ datasources:
|
||||
access: proxy
|
||||
url: http://localhost:9411
|
||||
editable: false
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": "-- Grafana --",
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"editable": true,
|
||||
"gnetId": null,
|
||||
"graphTooltip": 0,
|
||||
"iteration": 1596705352582,
|
||||
"links": [],
|
||||
"panels": [
|
||||
{
|
||||
"datasource": null,
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"custom": {}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 16,
|
||||
"w": 24,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 11,
|
||||
"options": {
|
||||
"content": "## Global variables\n\n* `__dashboard` = `${__dashboard}`\n* `__dashboard.name` = `${__dashboard.name}`\n* `__dashboard.uid` = `${__dashboard.uid}`\n* `__org.name` = `${__org.name}`\n* `__org.id` = `${__org.id}`\n* `__user.id` = `${__user.id}`\n* `__user.login` = `${__user.login}`\n \n## Formats\n\n* `Server:raw` = `${Server:raw}`\n* `Server:regex` = `${Server:regex}`\n* `Server:lucene` = `${Server:lucene}`\n* `Server:glob` = `${Server:glob}`\n* `Server:pipe` = `${Server:pipe}`\n* `Server:distributed` = `${Server:distributed}`\n* `Server:csv` = `${Server:csv}`\n* `Server:html` = `${Server:html}`\n* `Server:json` = `${Server:json}`\n* `Server:percentencode` = `${Server:percentencode}`\n* `Server:singlequote` = `${Server:singlequote}`\n* `Server:doublequote` = `${Server:doublequote}`\n* `Server:sqlstring` = `${Server:sqlstring}`\n* `Server:date` = `${Server:date}`\n* `Server:text` = `${Server:text}`\n\n",
|
||||
"mode": "markdown"
|
||||
},
|
||||
"pluginVersion": "7.1.0",
|
||||
"targets": [
|
||||
{
|
||||
"refId": "A",
|
||||
"scenarioId": "random_walk"
|
||||
}
|
||||
],
|
||||
"timeFrom": null,
|
||||
"timeShift": null,
|
||||
"title": "Variable interpolation",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"schemaVersion": 26,
|
||||
"style": "dark",
|
||||
"tags": ["gdev", "templating"],
|
||||
"templating": {
|
||||
"list": [
|
||||
{
|
||||
"allValue": null,
|
||||
"current": {
|
||||
"selected": true,
|
||||
"text": "All",
|
||||
"value": ["$__all"]
|
||||
},
|
||||
"hide": 0,
|
||||
"includeAll": true,
|
||||
"label": null,
|
||||
"multi": true,
|
||||
"name": "Server",
|
||||
"options": [
|
||||
{
|
||||
"selected": true,
|
||||
"text": "All",
|
||||
"value": "$__all"
|
||||
},
|
||||
{
|
||||
"selected": false,
|
||||
"text": "A'A\"A",
|
||||
"value": "A'A\"A"
|
||||
},
|
||||
{
|
||||
"selected": false,
|
||||
"text": "BB\\B",
|
||||
"value": "BB\\B"
|
||||
},
|
||||
{
|
||||
"selected": false,
|
||||
"text": "CCC",
|
||||
"value": "CCC"
|
||||
}
|
||||
],
|
||||
"query": "A'A\"A,BB\\B,CCC",
|
||||
"queryValue": "",
|
||||
"skipUrlSync": false,
|
||||
"type": "custom"
|
||||
}
|
||||
]
|
||||
},
|
||||
"time": {
|
||||
"from": "now-6h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {
|
||||
"refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"]
|
||||
},
|
||||
"timezone": "",
|
||||
"title": "Templating - Global variables and interpolation",
|
||||
"uid": "HYaGDGIMk",
|
||||
"version": 5
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": "-- Grafana --",
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"editable": true,
|
||||
"gnetId": null,
|
||||
"graphTooltip": 0,
|
||||
"id": null,
|
||||
"iteration": 1601526910610,
|
||||
"links": [
|
||||
{
|
||||
"icon": "external link",
|
||||
"includeVars": true,
|
||||
"tags": [],
|
||||
"title": "Grafana",
|
||||
"tooltip": "",
|
||||
"type": "link",
|
||||
"url": "http://www.grafana.com"
|
||||
},
|
||||
{
|
||||
"asDropdown": true,
|
||||
"icon": "external link",
|
||||
"includeVars": true,
|
||||
"tags": ["templating"],
|
||||
"title": "Link as DropDown",
|
||||
"type": "dashboards"
|
||||
},
|
||||
{
|
||||
"icon": "external link",
|
||||
"includeVars": true,
|
||||
"tags": ["demo"],
|
||||
"type": "dashboards"
|
||||
}
|
||||
],
|
||||
"panels": [
|
||||
{
|
||||
"description": "",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"custom": {}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 9,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 2,
|
||||
"options": {
|
||||
"content": "# ${custom.text}\n ",
|
||||
"mode": "markdown"
|
||||
},
|
||||
"pluginVersion": "7.3.0-pre",
|
||||
"targets": [
|
||||
{
|
||||
"refId": "A",
|
||||
"scenarioId": "random_walk"
|
||||
}
|
||||
],
|
||||
"timeFrom": null,
|
||||
"timeShift": null,
|
||||
"title": "${custom.text}",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"schemaVersion": 26,
|
||||
"style": "dark",
|
||||
"tags": ["gdev", "templating"],
|
||||
"templating": {
|
||||
"list": [
|
||||
{
|
||||
"allValue": null,
|
||||
"current": {
|
||||
"selected": false,
|
||||
"text": "All",
|
||||
"value": "$__all"
|
||||
},
|
||||
"hide": 0,
|
||||
"includeAll": true,
|
||||
"label": null,
|
||||
"multi": true,
|
||||
"name": "custom",
|
||||
"options": [
|
||||
{
|
||||
"selected": true,
|
||||
"text": "All",
|
||||
"value": "$__all"
|
||||
},
|
||||
{
|
||||
"selected": false,
|
||||
"text": "p1",
|
||||
"value": "p1"
|
||||
},
|
||||
{
|
||||
"selected": false,
|
||||
"text": "p2",
|
||||
"value": "p2"
|
||||
},
|
||||
{
|
||||
"selected": false,
|
||||
"text": "p3",
|
||||
"value": "p3"
|
||||
}
|
||||
],
|
||||
"query": "p1,p2,p3",
|
||||
"skipUrlSync": false,
|
||||
"type": "custom"
|
||||
}
|
||||
]
|
||||
},
|
||||
"time": {
|
||||
"from": "now-6h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {},
|
||||
"timezone": "",
|
||||
"title": "Templating - Dashboard Links and Variables",
|
||||
"uid": "yBCC3aKGk",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": "-- Grafana --",
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"editable": true,
|
||||
"gnetId": null,
|
||||
"graphTooltip": 0,
|
||||
"iteration": 1597300832273,
|
||||
"links": [],
|
||||
"panels": [
|
||||
{
|
||||
"datasource": "CsvData",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"custom": {
|
||||
"align": null
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Query"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "links",
|
||||
"value": [
|
||||
{
|
||||
"title": "Search",
|
||||
"url": "/d/spVR9LSMk/templating-textbox-and-data-links?var-query=${__value.raw:percentencode}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 2,
|
||||
"options": {
|
||||
"showHeader": true
|
||||
},
|
||||
"pluginVersion": "7.2.0-pre",
|
||||
"targets": [
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"fields": [
|
||||
{
|
||||
"config": {},
|
||||
"name": "Query",
|
||||
"type": "string",
|
||||
"values": ["Contains+Plus", "Contains&Ampersand", "Contains white space"]
|
||||
},
|
||||
{
|
||||
"config": {},
|
||||
"name": " Test",
|
||||
"type": "string",
|
||||
"values": ["asd", "asd", "asd"]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"timeFrom": null,
|
||||
"timeShift": null,
|
||||
"title": "Data",
|
||||
"type": "table"
|
||||
},
|
||||
{
|
||||
"aliasColors": {},
|
||||
"bars": false,
|
||||
"dashLength": 10,
|
||||
"dashes": false,
|
||||
"datasource": null,
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"custom": {}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"fill": 1,
|
||||
"fillGradient": 0,
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 0
|
||||
},
|
||||
"hiddenSeries": false,
|
||||
"id": 4,
|
||||
"legend": {
|
||||
"avg": false,
|
||||
"current": false,
|
||||
"max": false,
|
||||
"min": false,
|
||||
"show": true,
|
||||
"total": false,
|
||||
"values": false
|
||||
},
|
||||
"lines": true,
|
||||
"linewidth": 1,
|
||||
"nullPointMode": "null",
|
||||
"options": {
|
||||
"alertThreshold": true
|
||||
},
|
||||
"percentage": false,
|
||||
"pluginVersion": "7.2.0-pre",
|
||||
"pointradius": 2,
|
||||
"points": false,
|
||||
"renderer": "flot",
|
||||
"seriesOverrides": [],
|
||||
"spaceLength": 10,
|
||||
"stack": false,
|
||||
"steppedLine": false,
|
||||
"targets": [
|
||||
{
|
||||
"alias": "${query}",
|
||||
"refId": "A",
|
||||
"scenarioId": "random_walk"
|
||||
}
|
||||
],
|
||||
"thresholds": [],
|
||||
"timeFrom": null,
|
||||
"timeRegions": [],
|
||||
"timeShift": null,
|
||||
"title": "Query: ${query}",
|
||||
"tooltip": {
|
||||
"shared": true,
|
||||
"sort": 0,
|
||||
"value_type": "individual"
|
||||
},
|
||||
"type": "graph",
|
||||
"xaxis": {
|
||||
"buckets": null,
|
||||
"mode": "time",
|
||||
"name": null,
|
||||
"show": true,
|
||||
"values": []
|
||||
},
|
||||
"yaxes": [
|
||||
{
|
||||
"format": "short",
|
||||
"label": null,
|
||||
"logBase": 1,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"format": "short",
|
||||
"label": null,
|
||||
"logBase": 1,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"show": true
|
||||
}
|
||||
],
|
||||
"yaxis": {
|
||||
"align": false,
|
||||
"alignLevel": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"schemaVersion": 26,
|
||||
"style": "dark",
|
||||
"tags": ["gdev", "templating"],
|
||||
"templating": {
|
||||
"list": [
|
||||
{
|
||||
"current": {
|
||||
"selected": false,
|
||||
"text": "asdasda+",
|
||||
"value": "asdasda+"
|
||||
},
|
||||
"hide": 0,
|
||||
"label": null,
|
||||
"name": "query",
|
||||
"options": [
|
||||
{
|
||||
"selected": true,
|
||||
"text": "asdasda+",
|
||||
"value": "asdasda+"
|
||||
}
|
||||
],
|
||||
"query": "asdasda+",
|
||||
"skipUrlSync": false,
|
||||
"type": "textbox"
|
||||
}
|
||||
]
|
||||
},
|
||||
"time": {
|
||||
"from": "now-6h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {
|
||||
"refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"]
|
||||
},
|
||||
"timezone": "",
|
||||
"title": "Templating - Textbox & data links",
|
||||
"uid": "spVR9LSMk",
|
||||
"version": 9
|
||||
}
|
||||
@@ -10,7 +10,7 @@ ADD etc_mtab /etc/mtab
|
||||
|
||||
ADD collectd.conf.tpl /etc/collectd/collectd.conf.tpl
|
||||
|
||||
RUN pip install envtpl
|
||||
RUN pip install --no-cache-dir envtpl
|
||||
ADD start_container /usr/bin/start_container
|
||||
RUN chmod +x /usr/bin/start_container
|
||||
CMD start_container
|
||||
|
||||
@@ -35,7 +35,7 @@ RUN if [ ! -z "${CONTAINER_TIMEZONE}" ]; \
|
||||
|
||||
# fix python dependencies (LTS Django and newer memcached/txAMQP)
|
||||
RUN pip install --upgrade pip && \
|
||||
pip install django==1.8.18 \
|
||||
pip install --no-cache-dir django==1.8.18 \
|
||||
python-memcached==1.53 \
|
||||
txAMQP==0.6.2
|
||||
|
||||
@@ -62,13 +62,13 @@ RUN python ./setup.py install
|
||||
# install carbon
|
||||
RUN git clone -b ${carbon_version} --depth 1 ${carbon_repo} /usr/local/src/carbon
|
||||
WORKDIR /usr/local/src/carbon
|
||||
RUN pip install -r requirements.txt \
|
||||
RUN pip install --no-cache-dir -r requirements.txt \
|
||||
&& python ./setup.py install
|
||||
|
||||
# install graphite
|
||||
RUN git clone -b ${graphite_version} --depth 1 ${graphite_repo} /usr/local/src/graphite-web
|
||||
WORKDIR /usr/local/src/graphite-web
|
||||
RUN pip install -r requirements.txt \
|
||||
RUN pip install --no-cache-dir -r requirements.txt \
|
||||
&& python ./setup.py install
|
||||
|
||||
# install statsd
|
||||
|
||||
@@ -30,7 +30,7 @@ fi
|
||||
# - /opt/statsd
|
||||
statsd_dir_contents=$(find /opt/statsd -mindepth 1 -print -quit)
|
||||
if [[ -z $statsd_dir_contents ]]; then
|
||||
git clone -b v0.7.2 https://github.com/etsy/statsd.git /opt/statsd
|
||||
git clone --depth 1 -b v0.7.2 https://github.com/etsy/statsd.git /opt/statsd
|
||||
cp $conf_dir/opt/statsd/config.js /opt/statsd/config.js
|
||||
fi
|
||||
|
||||
|
||||
1
devenv/docker/blocks/influxdb/.env
Normal file
1
devenv/docker/blocks/influxdb/.env
Normal file
@@ -0,0 +1 @@
|
||||
influxdb_version=1.8.1-alpine
|
||||
@@ -1,5 +1,5 @@
|
||||
influxdb:
|
||||
image: influxdb:1.7.6
|
||||
image: influxdb:${influxdb_version}
|
||||
container_name: influxdb
|
||||
ports:
|
||||
- '2004:2004'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# This Dockerfile builds an image for a client_golang example.
|
||||
|
||||
# Builder image, where we build the example.
|
||||
FROM golang:1.14.1 AS builder
|
||||
FROM golang:1.15.1 AS builder
|
||||
# Download prometheus/client_golang/examples/random first
|
||||
RUN go get github.com/prometheus/client_golang/examples/random
|
||||
WORKDIR /go/src/github.com/prometheus/client_golang
|
||||
|
||||
@@ -3,7 +3,7 @@ import { createClient, createBasicAuthClient } from './modules/client.js';
|
||||
import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js';
|
||||
|
||||
export let options = {
|
||||
noCookiesReset: true
|
||||
noCookiesReset: true,
|
||||
};
|
||||
|
||||
let endpoint = __ENV.URL || 'http://localhost:3000';
|
||||
@@ -18,35 +18,38 @@ export const setup = () => {
|
||||
orgId: orgId,
|
||||
datasourceId: datasourceId,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export default (data) => {
|
||||
group("annotation by tag test", () => {
|
||||
export default data => {
|
||||
group('annotation by tag test', () => {
|
||||
if (__ITER === 0) {
|
||||
group("user authenticates thru ui with username and password", () => {
|
||||
group('user authenticates thru ui with username and password', () => {
|
||||
let res = client.ui.login('admin', 'admin');
|
||||
|
||||
check(res, {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response has cookie \'grafana_session\' with 32 characters': (r) => r.cookies.grafana_session[0].value.length === 32,
|
||||
'response status is 200': r => r.status === 200,
|
||||
"response has cookie 'grafana_session' with 32 characters": r =>
|
||||
r.cookies.grafana_session[0].value.length === 32,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (__ITER !== 0) {
|
||||
group("batch tsdb requests with annotations by tag", () => {
|
||||
group('batch tsdb requests with annotations by tag', () => {
|
||||
const batchCount = 20;
|
||||
const requests = [];
|
||||
const payload = {
|
||||
from: '1547765247624',
|
||||
to: '1547768847624',
|
||||
queries: [{
|
||||
refId: 'A',
|
||||
scenarioId: 'random_walk',
|
||||
intervalMs: 10000,
|
||||
maxDataPoints: 433,
|
||||
datasourceId: data.datasourceId,
|
||||
}]
|
||||
queries: [
|
||||
{
|
||||
refId: 'A',
|
||||
scenarioId: 'random_walk',
|
||||
intervalMs: 10000,
|
||||
maxDataPoints: 433,
|
||||
datasourceId: data.datasourceId,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
requests.push({ method: 'GET', url: '/api/annotations?from=1580825186534&to=1580846786535' });
|
||||
@@ -58,14 +61,14 @@ export default (data) => {
|
||||
let responses = client.batch(requests);
|
||||
for (let n = 0; n < batchCount; n++) {
|
||||
check(responses[n], {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response status is 200': r => r.status === 200,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
sleep(5)
|
||||
}
|
||||
sleep(5);
|
||||
};
|
||||
|
||||
export const teardown = (data) => {}
|
||||
export const teardown = data => {};
|
||||
|
||||
@@ -2,7 +2,7 @@ import { sleep, check, group } from 'k6';
|
||||
import { createBasicAuthClient } from './modules/client.js';
|
||||
|
||||
export let options = {
|
||||
noCookiesReset: true
|
||||
noCookiesReset: true,
|
||||
};
|
||||
|
||||
let endpoint = __ENV.URL || 'http://localhost:10080/grafana';
|
||||
@@ -19,17 +19,17 @@ export const setup = () => {
|
||||
return {
|
||||
datasourceId: res.json().id,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export default (data) => {
|
||||
group("auth proxy test", () => {
|
||||
group("batch proxy requests", () => {
|
||||
export default data => {
|
||||
group('auth proxy test', () => {
|
||||
group('batch proxy requests', () => {
|
||||
const d = new Date();
|
||||
const batchCount = 300;
|
||||
const requests = [];
|
||||
const query = encodeURI('topk(5, max(scrape_duration_seconds) by (job))');
|
||||
const start = (d.getTime() / 1000) - 3600;
|
||||
const end = (d.getTime() / 1000);
|
||||
const start = d.getTime() / 1000 - 3600;
|
||||
const end = d.getTime() / 1000;
|
||||
const step = 20;
|
||||
|
||||
requests.push({ method: 'GET', url: '/api/annotations?dashboardId=8&from=1558670300607&to=1558691900607' });
|
||||
@@ -44,13 +44,13 @@ export default (data) => {
|
||||
let responses = client.batch(requests);
|
||||
for (let n = 0; n < batchCount; n++) {
|
||||
check(responses[n], {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response status is 200': r => r.status === 200,
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
sleep(5)
|
||||
}
|
||||
sleep(5);
|
||||
};
|
||||
|
||||
export const teardown = (data) => {}
|
||||
export const teardown = data => {};
|
||||
|
||||
@@ -3,11 +3,11 @@ import { createClient, createBasicAuthClient } from './modules/client.js';
|
||||
import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js';
|
||||
|
||||
export let options = {
|
||||
noCookiesReset: true
|
||||
noCookiesReset: true,
|
||||
};
|
||||
|
||||
let endpoint = __ENV.URL || 'http://localhost:3000';
|
||||
const slowQuery = (__ENV.SLOW_QUERY && __ENV.SLOW_QUERY.length > 0) ? parseInt(__ENV.SLOW_QUERY, 10) : 5;
|
||||
const slowQuery = __ENV.SLOW_QUERY && __ENV.SLOW_QUERY.length > 0 ? parseInt(__ENV.SLOW_QUERY, 10) : 5;
|
||||
const client = createClient(endpoint);
|
||||
|
||||
export const setup = () => {
|
||||
@@ -19,17 +19,18 @@ export const setup = () => {
|
||||
orgId: orgId,
|
||||
datasourceId: datasourceId,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export default (data) => {
|
||||
export default data => {
|
||||
group(`user auth token slow test (queries between 1 and ${slowQuery} seconds)`, () => {
|
||||
if (__ITER === 0) {
|
||||
group("user authenticates thru ui with username and password", () => {
|
||||
group('user authenticates thru ui with username and password', () => {
|
||||
let res = client.ui.login('admin', 'admin');
|
||||
|
||||
check(res, {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response has cookie \'grafana_session\' with 32 characters': (r) => r.cookies.grafana_session[0].value.length === 32,
|
||||
'response status is 200': r => r.status === 200,
|
||||
"response has cookie 'grafana_session' with 32 characters": r =>
|
||||
r.cookies.grafana_session[0].value.length === 32,
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -41,14 +42,16 @@ export default (data) => {
|
||||
const payload = {
|
||||
from: '1547765247624',
|
||||
to: '1547768847624',
|
||||
queries: [{
|
||||
refId: 'A',
|
||||
scenarioId: 'slow_query',
|
||||
stringInput: `${Math.floor(Math.random() * slowQuery) + 1}s`,
|
||||
intervalMs: 10000,
|
||||
maxDataPoints: 433,
|
||||
datasourceId: data.datasourceId,
|
||||
}]
|
||||
queries: [
|
||||
{
|
||||
refId: 'A',
|
||||
scenarioId: 'slow_query',
|
||||
stringInput: `${Math.floor(Math.random() * slowQuery) + 1}s`,
|
||||
intervalMs: 10000,
|
||||
maxDataPoints: 433,
|
||||
datasourceId: data.datasourceId,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
requests.push({ method: 'GET', url: '/api/annotations?dashboardId=2074&from=1548078832772&to=1548082432772' });
|
||||
@@ -60,14 +63,14 @@ export default (data) => {
|
||||
let responses = client.batch(requests);
|
||||
for (let n = 0; n < batchCount; n++) {
|
||||
check(responses[n], {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response status is 200': r => r.status === 200,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
sleep(5)
|
||||
}
|
||||
sleep(5);
|
||||
};
|
||||
|
||||
export const teardown = (data) => {}
|
||||
export const teardown = data => {};
|
||||
|
||||
@@ -3,7 +3,7 @@ import { createClient, createBasicAuthClient } from './modules/client.js';
|
||||
import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js';
|
||||
|
||||
export let options = {
|
||||
noCookiesReset: true
|
||||
noCookiesReset: true,
|
||||
};
|
||||
|
||||
let endpoint = __ENV.URL || 'http://localhost:3000';
|
||||
@@ -18,35 +18,38 @@ export const setup = () => {
|
||||
orgId: orgId,
|
||||
datasourceId: datasourceId,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export default (data) => {
|
||||
group("user auth token test", () => {
|
||||
export default data => {
|
||||
group('user auth token test', () => {
|
||||
if (__ITER === 0) {
|
||||
group("user authenticates thru ui with username and password", () => {
|
||||
group('user authenticates thru ui with username and password', () => {
|
||||
let res = client.ui.login('admin', 'admin');
|
||||
|
||||
check(res, {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response has cookie \'grafana_session\' with 32 characters': (r) => r.cookies.grafana_session[0].value.length === 32,
|
||||
'response status is 200': r => r.status === 200,
|
||||
"response has cookie 'grafana_session' with 32 characters": r =>
|
||||
r.cookies.grafana_session[0].value.length === 32,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (__ITER !== 0) {
|
||||
group("batch tsdb requests", () => {
|
||||
group('batch tsdb requests', () => {
|
||||
const batchCount = 20;
|
||||
const requests = [];
|
||||
const payload = {
|
||||
from: '1547765247624',
|
||||
to: '1547768847624',
|
||||
queries: [{
|
||||
refId: 'A',
|
||||
scenarioId: 'random_walk',
|
||||
intervalMs: 10000,
|
||||
maxDataPoints: 433,
|
||||
datasourceId: data.datasourceId,
|
||||
}]
|
||||
queries: [
|
||||
{
|
||||
refId: 'A',
|
||||
scenarioId: 'random_walk',
|
||||
intervalMs: 10000,
|
||||
maxDataPoints: 433,
|
||||
datasourceId: data.datasourceId,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
requests.push({ method: 'GET', url: '/api/annotations?dashboardId=2074&from=1548078832772&to=1548082432772' });
|
||||
@@ -58,14 +61,14 @@ export default (data) => {
|
||||
let responses = client.batch(requests);
|
||||
for (let n = 0; n < batchCount; n++) {
|
||||
check(responses[n], {
|
||||
'response status is 200': (r) => r.status === 200,
|
||||
'response status is 200': r => r.status === 200,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
sleep(5)
|
||||
}
|
||||
sleep(5);
|
||||
};
|
||||
|
||||
export const teardown = (data) => {}
|
||||
export const teardown = data => {};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import http from "k6/http";
|
||||
import http from 'k6/http';
|
||||
import encoding from 'k6/encoding';
|
||||
|
||||
export const UIEndpoint = class UIEndpoint {
|
||||
@@ -10,7 +10,7 @@ export const UIEndpoint = class UIEndpoint {
|
||||
const payload = { user: username, password: pwd };
|
||||
return this.httpClient.formPost('/login', payload);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const DatasourcesEndpoint = class DatasourcesEndpoint {
|
||||
constructor(httpClient) {
|
||||
@@ -32,7 +32,7 @@ export const DatasourcesEndpoint = class DatasourcesEndpoint {
|
||||
delete(id) {
|
||||
return this.httpClient.delete(`/datasources/${id}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const OrganizationsEndpoint = class OrganizationsEndpoint {
|
||||
constructor(httpClient) {
|
||||
@@ -57,7 +57,7 @@ export const OrganizationsEndpoint = class OrganizationsEndpoint {
|
||||
delete(id) {
|
||||
return this.httpClient.delete(`/orgs/${id}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const GrafanaClient = class GrafanaClient {
|
||||
constructor(httpClient) {
|
||||
@@ -79,10 +79,10 @@ export const GrafanaClient = class GrafanaClient {
|
||||
onBeforeRequest(params) {
|
||||
if (this.orgId && this.orgId > 0) {
|
||||
params = params.headers || {};
|
||||
params.headers["X-Grafana-Org-Id"] = this.orgId;
|
||||
params.headers['X-Grafana-Org-Id'] = this.orgId;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const BaseClient = class BaseClient {
|
||||
constructor(url, subUrl) {
|
||||
@@ -99,14 +99,12 @@ export const BaseClient = class BaseClient {
|
||||
}
|
||||
|
||||
withUrl(subUrl) {
|
||||
let c = new BaseClient(this.url, subUrl);
|
||||
let c = new BaseClient(this.url, subUrl);
|
||||
c.onBeforeRequest = this.onBeforeRequest;
|
||||
return c;
|
||||
}
|
||||
|
||||
beforeRequest(params) {
|
||||
|
||||
}
|
||||
beforeRequest(params) {}
|
||||
|
||||
get(url, params) {
|
||||
params = params || {};
|
||||
@@ -156,7 +154,7 @@ export const BaseClient = class BaseClient {
|
||||
|
||||
return http.batch(requests);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export class BasicAuthClient extends BaseClient {
|
||||
constructor(url, subUrl, username, password) {
|
||||
@@ -166,7 +164,7 @@ export class BasicAuthClient extends BaseClient {
|
||||
}
|
||||
|
||||
withUrl(subUrl) {
|
||||
let c = new BasicAuthClient(this.url, subUrl, this.username, this.password);
|
||||
let c = new BasicAuthClient(this.url, subUrl, this.username, this.password);
|
||||
c.onBeforeRequest = this.onBeforeRequest;
|
||||
return c;
|
||||
}
|
||||
@@ -179,10 +177,10 @@ export class BasicAuthClient extends BaseClient {
|
||||
}
|
||||
}
|
||||
|
||||
export const createClient = (url) => {
|
||||
export const createClient = url => {
|
||||
return new GrafanaClient(new BaseClient(url, ''));
|
||||
}
|
||||
};
|
||||
|
||||
export const createBasicAuthClient = (url, username, password) => {
|
||||
return new GrafanaClient(new BasicAuthClient(url, '', username, password));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export const createTestOrgIfNotExists = (client) => {
|
||||
export const createTestOrgIfNotExists = client => {
|
||||
let orgId = 0;
|
||||
let res = client.orgs.getByName('k6');
|
||||
if (res.status === 404) {
|
||||
@@ -13,9 +13,9 @@ export const createTestOrgIfNotExists = (client) => {
|
||||
|
||||
client.withOrgId(orgId);
|
||||
return orgId;
|
||||
}
|
||||
};
|
||||
|
||||
export const createTestdataDatasourceIfNotExists = (client) => {
|
||||
export const createTestdataDatasourceIfNotExists = client => {
|
||||
const payload = {
|
||||
access: 'proxy',
|
||||
isDefault: false,
|
||||
@@ -32,4 +32,4 @@ export const createTestdataDatasourceIfNotExists = (client) => {
|
||||
}
|
||||
|
||||
return res.json().id;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,19 +1,15 @@
|
||||
module.exports = {
|
||||
verbose: true,
|
||||
"globals": {
|
||||
"ts-jest": {
|
||||
"tsConfigFile": "tsconfig.json"
|
||||
}
|
||||
globals: {
|
||||
'ts-jest': {
|
||||
tsConfigFile: 'tsconfig.json',
|
||||
},
|
||||
},
|
||||
"transform": {
|
||||
"^.+\\.tsx?$": "<rootDir>/../../node_modules/ts-jest/preprocessor.js"
|
||||
transform: {
|
||||
'^.+\\.tsx?$': '<rootDir>/../../node_modules/ts-jest/preprocessor.js',
|
||||
},
|
||||
"moduleDirectories": ["node_modules"],
|
||||
"testRegex": "(\\.|/)(test)\\.ts$",
|
||||
"testEnvironment": "node",
|
||||
"moduleFileExtensions": [
|
||||
"ts",
|
||||
"js",
|
||||
"json"
|
||||
],
|
||||
moduleDirectories: ['node_modules'],
|
||||
testRegex: '(\\.|/)(test)\\.ts$',
|
||||
testEnvironment: 'node',
|
||||
moduleFileExtensions: ['ts', 'js', 'json'],
|
||||
};
|
||||
|
||||
3
devenv/local-npm/conf/nginx/Dockerfile
Normal file
3
devenv/local-npm/conf/nginx/Dockerfile
Normal file
@@ -0,0 +1,3 @@
|
||||
FROM tutum/nginx
|
||||
RUN rm /etc/nginx/sites-enabled/default
|
||||
ADD sites-enabled /etc/nginx/sites-enabled
|
||||
14
devenv/local-npm/conf/nginx/sites-enabled/verdaccio-conf
Normal file
14
devenv/local-npm/conf/nginx/sites-enabled/verdaccio-conf
Normal file
@@ -0,0 +1,14 @@
|
||||
server {
|
||||
listen 80 default_server;
|
||||
access_log /var/log/nginx/verdaccio.log;
|
||||
charset utf-8;
|
||||
location / {
|
||||
proxy_pass http://grafana-npm.local:4873/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-NginX-Proxy true;
|
||||
proxy_ssl_session_reuse off;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_redirect off;
|
||||
}
|
||||
}
|
||||
26
devenv/local-npm/docker-compose.yaml
Normal file
26
devenv/local-npm/docker-compose.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
verdaccio:
|
||||
image: verdaccio/verdaccio:4
|
||||
container_name: verdaccio_root_path
|
||||
ports:
|
||||
- "4873:4873"
|
||||
volumes:
|
||||
- verdaccio:/verdaccio
|
||||
|
||||
nginx:
|
||||
restart: always
|
||||
build: conf/nginx
|
||||
ports:
|
||||
- "80:80"
|
||||
volumes:
|
||||
- /www/public
|
||||
volumes_from:
|
||||
- verdaccio
|
||||
links:
|
||||
- verdaccio:verdaccio
|
||||
|
||||
volumes:
|
||||
verdaccio:
|
||||
driver: local
|
||||
@@ -33,6 +33,6 @@ Images are currently hosted in the grafana/website repo.
|
||||
|
||||
## Deploy changes to grafana.com
|
||||
|
||||
When a PR is merged to master with changes in the `docs` directory, those changes are automatically synched to the grafana/website repo on the `docs-grafana` branch.
|
||||
When a PR is merged to master with changes in the `docs/sources` directory, those changes are automatically synched to the grafana/website repo and published to the staging site.
|
||||
|
||||
In order to make those changes live, open a PR in the website repo that merges the `docs-grafana` branch into `master`. Then follow the publishing guidelines in that repo.
|
||||
Generally, someone from marketing will publish to production each day, so as long as the sync is successful your docs edits will be published. Alternatively, you can refer to [publishing to production](https://github.com/grafana/website#publishing-to-production-grafanacom) if you'd like to do it yourself.
|
||||
@@ -30,7 +30,7 @@ aliases = ["/docs/grafana/v1.1", "/docs/grafana/latest/guides/reference/admin",
|
||||
<img src="/static/img/logos/logo-docker.svg">
|
||||
<h5>Run Docker image</h5>
|
||||
</a>
|
||||
<a href="https://grafana.com/cloud/grafana" class="nav-cards__item nav-cards__item--install">
|
||||
<a href="https://grafana.com/docs/grafana-cloud/" class="nav-cards__item nav-cards__item--install">
|
||||
<div class="nav-cards__icon fa fa-cloud">
|
||||
</div>
|
||||
<h5>Grafana Cloud</h5>
|
||||
|
||||
@@ -10,4 +10,4 @@ weight = 2
|
||||
|
||||
# Administration
|
||||
|
||||
This section provides resources for Grafana administrators.
|
||||
This section provides resources for Grafana administrators and users performing administrative tasks.
|
||||
|
||||
59
docs/sources/administration/change-home-dashboard.md
Normal file
59
docs/sources/administration/change-home-dashboard.md
Normal file
@@ -0,0 +1,59 @@
|
||||
+++
|
||||
title = "Change the default home dashboard"
|
||||
description = "How to replace the default home dashboard"
|
||||
keywords = ["grafana", "configuration", "documentation", "home"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
name = "Home Dashboard"
|
||||
identifier = "change-home-dashboard"
|
||||
parent = "admin"
|
||||
weight = 100
|
||||
+++
|
||||
|
||||
# Change the default home dashboard
|
||||
|
||||
You can change the default dashboard on the organization, team and user level. The home dashboard you set for the whole organization is the one all users will see by default. The team dashboard applies to all users assigned to the team in Grafana. The team dashboard overrides the organization dashboard settings. Personal dashboard settings override team dashboard settings.
|
||||
|
||||
## Set the home dashboard for your organization
|
||||
|
||||
### Set the default dashboard through preferences
|
||||
|
||||
1. Navigate to the dashboard you want to set as the home dashboard.
|
||||
1. Star this dashboard by clicking on the star next to the dashboard title.
|
||||
1. On the left menu, hover your cursor over the **Configuration** (gear) icon and then click **Preferences**.
|
||||
1. In the **Home Dashboard** field, select the dashboard you want to use for your home dashboard. Options include all starred dashboards.
|
||||
|
||||
### Set the default dashboard through configuration
|
||||
|
||||
If preferences are set as described above, then they override this value.
|
||||
You can provide your own JSON file to change the home dashboard. No user will be able to update this dashboard in Grafana.
|
||||
|
||||
#### [Optional] Convert an existing dashboard into a JSON file
|
||||
1. Navigate to your dashboard page.
|
||||
1. Click the **Share dashboard** icon next to the dashboard title.
|
||||
1. In the **Export** tab, click on **Save to file**.
|
||||
|
||||
#### Use a JSON file as the home dashboard
|
||||
1. Save your JSON file somewhere that Grafana can access it, for example, in the Grafana `data` folder of Grafana.
|
||||
1. Update your configuration file to set the path to the JSON file. Read how to update this file in the [configuration]({{< relref "./configuration.md">}}) documentation.
|
||||
```ini
|
||||
[dashboards]
|
||||
# Path to the default home dashboard. If this value is empty, then Grafana uses StaticRootPath + "dashboards/home.json"
|
||||
default_home_dashboard_path = data/main-dashboard.json
|
||||
```
|
||||
|
||||
## Set home dashboard for your team
|
||||
|
||||
1. Navigate to the dashboard you want to set as the home dashboard.
|
||||
1. Star this dashboard by clicking on the star next to the dashboard title.
|
||||
1. On the left menu, hover your cursor over the **Configuration** (gear) icon and then click **Teams**.
|
||||
1. Click on the team you want to change the home dashboard for and then navigate to the **Settings** tab.
|
||||
1. In the **Home Dashboard** field, select the dashboard you want to use for your home dashboard. Options include all starred dashboards.
|
||||
|
||||
## Set your personal home dashboard
|
||||
|
||||
1. Navigate to the dashboard you want to set as the home dashboard.
|
||||
1. Star this dashboard by clicking on the star next to the dashboard title.
|
||||
1. On the left menu, hover your cursor over your avatar and then click **Preferences**.
|
||||
1. In the **Home Dashboard** field, select the dashboard you want to use for your home dashboard. Options include all starred dashboards.
|
||||
|
||||
29
docs/sources/administration/change-your-password.md
Normal file
29
docs/sources/administration/change-your-password.md
Normal file
@@ -0,0 +1,29 @@
|
||||
+++
|
||||
title = "Change your password"
|
||||
description = "How to change your Grafana password"
|
||||
keywords = ["grafana", "password", "change", "preferences"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 100
|
||||
+++
|
||||
|
||||
# Change your Grafana password
|
||||
|
||||
You can change your password in the Change Password tab.
|
||||
|
||||
> **Note:** If your Grafana instance uses an external authentication provider, then you might not be able to change your password. Contact your Grafana administrator for more information.
|
||||
|
||||
## Change your password
|
||||
|
||||
1. Hover your mouse over your user icon in the lower left corner of the screen.
|
||||
1. Click **Change Password**. Grafana opens the Change Password tab.
|
||||
1. Enter your **Old password** to authorize the change.
|
||||
1. Enter your **New password** and then **Confirm password**.
|
||||
1. Click **Change Password**.
|
||||
|
||||
## Admin user management resources
|
||||
|
||||
Grafana admins can use the following tools:
|
||||
|
||||
- Use the [User API]({{< relref "../http_api/user.md" >}}) to change your password programmatically or to manage users.
|
||||
- The [Manage users]({{< relref "../manage-users/_index.md" >}}) section explains how to manage users and teams.
|
||||
@@ -37,7 +37,7 @@ Refer to [Configure a Grafana Docker image]({{< relref "../installation/configur
|
||||
|
||||
`sample.ini` is in the same directory as `defaults.ini` and contains all the settings commented out. Copy `sample.ini` and name it `custom.ini`.
|
||||
|
||||
### MacOS
|
||||
### macOS
|
||||
|
||||
By default, the configuration file is located at `/usr/local/etc/grafana/grafana.ini`. To configure Grafana, add a configuration file named `custom.ini` to the `conf` folder to override any of the settings defined in `conf/defaults.ini`.
|
||||
|
||||
@@ -189,8 +189,6 @@ Folder that contains [provisioning]({{< relref "provisioning.md" >}}) config fil
|
||||
|
||||
`http`,`https`,`h2` or `socket`
|
||||
|
||||
> **Note:** Grafana versions earlier than 3.0 are vulnerable to [POODLE](https://en.wikipedia.org/wiki/POODLE). So we strongly recommend to upgrade to 3.x or use a reverse proxy for SSL termination.
|
||||
|
||||
### http_addr
|
||||
|
||||
The IP address to bind to. If empty will bind to all interfaces
|
||||
@@ -231,8 +229,6 @@ callback URL to be correct).
|
||||
|
||||
### serve_from_sub_path
|
||||
|
||||
> Available in Grafana 6.3+.
|
||||
|
||||
Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons.
|
||||
|
||||
By enabling this setting and using a subpath in `root_url` above, e.g.
|
||||
@@ -273,7 +269,7 @@ Path where the socket should be created when `protocol=socket`. Make sure that G
|
||||
## [database]
|
||||
|
||||
Grafana needs a database to store users and dashboards (and other
|
||||
things). By default it is configured to use `sqlite3` which is an
|
||||
things). By default it is configured to use [`sqlite3`](https://www.sqlite.org/index.html) which is an
|
||||
embedded database (included in the main Grafana binary).
|
||||
|
||||
### type
|
||||
@@ -536,6 +532,10 @@ Number dashboard versions to keep (per dashboard). Default: `20`, Minimum: `1`.
|
||||
This prevents users from setting the dashboard refresh interval of a lower than given interval. Per default this is 5 seconds.
|
||||
The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. `30s` or `1m`.
|
||||
|
||||
### default_home_dashboard_path
|
||||
|
||||
Path to the default home dashboard. If this value is empty, then Grafana uses StaticRootPath + "dashboards/home.json"
|
||||
|
||||
<hr />
|
||||
|
||||
## [users]
|
||||
@@ -642,17 +642,13 @@ This setting is ignored if multiple OAuth providers are configured. Default is `
|
||||
|
||||
### oauth_state_cookie_max_age
|
||||
|
||||
How long the OAuth state cookie lives before being deleted. Default is `60` (seconds)
|
||||
How many seconds the OAuth state cookie lives before being deleted. Default is `600` (seconds)
|
||||
Administrators can increase this if they experience OAuth login state mismatch errors.
|
||||
|
||||
### api_key_max_seconds_to_live
|
||||
|
||||
Limit of API key seconds to live before expiration. Default is -1 (unlimited).
|
||||
|
||||
### default_home_dashboard_path
|
||||
|
||||
Path to the default home dashboard. If this value is empty, then Grafana uses StaticRootPath + "dashboards/home.json"
|
||||
|
||||
<hr />
|
||||
|
||||
## [auth.anonymous]
|
||||
@@ -976,6 +972,43 @@ Sets the minimum interval between rule evaluations. Default value is `1`.
|
||||
|
||||
> **Note.** This setting has precedence over each individual rule frequency. If a rule frequency is lower than this value, then this value is enforced.
|
||||
|
||||
### max_annotation_age =
|
||||
|
||||
Configures for how long alert annotations are stored. Default is 0, which keeps them forever.
|
||||
This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
|
||||
### max_annotations_to_keep =
|
||||
|
||||
Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations.
|
||||
|
||||
<hr>
|
||||
|
||||
## [annotations.dashboard]
|
||||
|
||||
Dashboard annotations means that annotations are associated with the dashboard they are created on.
|
||||
|
||||
### max_age
|
||||
|
||||
Configures how long dashboard annotations are stored. Default is 0, which keeps them forever.
|
||||
This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
|
||||
### max_annotations_to_keep
|
||||
|
||||
Configures max number of dashboard annotations that Grafana stores. Default value is 0, which keeps all dashboard annotations.
|
||||
|
||||
## [annotations.api]
|
||||
|
||||
API annotations means that the annotations have been created using the API without any association with a dashboard.
|
||||
|
||||
### max_age
|
||||
|
||||
Configures how long Grafana stores API annotations. Default is 0, which keeps them forever.
|
||||
This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
|
||||
### max_annotations_to_keep
|
||||
|
||||
Configures max number of API annotations that Grafana keeps. Default value is 0, which keeps all API annotations.
|
||||
|
||||
<hr>
|
||||
|
||||
## [explore]
|
||||
@@ -1179,10 +1212,10 @@ Optional URL to send to users in notifications. If the string contains the seque
|
||||
|
||||
### key_file
|
||||
|
||||
Path to JSON key file associated with a Google service account to authenticate and authorize.
|
||||
Optional path to JSON key file associated with a Google service account to authenticate and authorize. If no value is provided it tries to use the [application default credentials](https://cloud.google.com/docs/authentication/production#finding_credentials_automatically).
|
||||
Service Account keys can be created and downloaded from https://console.developers.google.com/permissions/serviceaccounts.
|
||||
|
||||
Service Account should have "Storage Object Writer" role. The access control model of the bucket needs to be "Set object-level and bucket-level permissions". Grafana itself will make the images public readable.
|
||||
Service Account should have "Storage Object Writer" role. The access control model of the bucket needs to be "Set object-level and bucket-level permissions". Grafana itself will make the images public readable when signed urls are not enabled.
|
||||
|
||||
### bucket
|
||||
|
||||
@@ -1192,6 +1225,15 @@ Bucket Name on Google Cloud Storage.
|
||||
|
||||
Optional extra path inside bucket.
|
||||
|
||||
### enable_signed_urls
|
||||
|
||||
If set to true, Grafana creates a [signed URL](https://cloud.google.com/storage/docs/access-control/signed-urls] for
|
||||
the image uploaded to Google Cloud Storage.
|
||||
|
||||
### signed_url_expiration
|
||||
|
||||
Sets the signed URL expiration, which defaults to seven days.
|
||||
|
||||
## [external_image_storage.azure_blob]
|
||||
|
||||
### account_name
|
||||
@@ -1350,3 +1392,40 @@ For more information about Grafana Enterprise, refer to [Grafana Enterprise]({{<
|
||||
### enable
|
||||
|
||||
Keys of alpha features to enable, separated by space. Available alpha features are: `transformations`
|
||||
|
||||
## [date_formats]
|
||||
|
||||
> The date format options below are only available in Grafana v7.2+
|
||||
|
||||
This section controls system wide defaults for date formats used in time ranges, graphs and date input boxes.
|
||||
|
||||
The format patterns use [Moment.js](https://momentjs.com/docs/#/displaying/) formatting tokens.
|
||||
|
||||
### full_date
|
||||
|
||||
Full date format used by time range picker and in other places where a full date is rendered.
|
||||
|
||||
### intervals
|
||||
|
||||
These intervals formats are used in the graph to show only a partial date or time. For example if there are only
|
||||
minutes between y-axis tick labels then the `interval_minute` format is used.
|
||||
|
||||
Defaults
|
||||
|
||||
```
|
||||
interval_second = HH:mm:ss
|
||||
interval_minute = HH:mm
|
||||
interval_hour = MM/DD HH:mm
|
||||
interval_day = MM/DD
|
||||
interval_month = YYYY-MM
|
||||
interval_year = YYYY
|
||||
```
|
||||
|
||||
### use_browser_locale
|
||||
|
||||
Set this to `true` to have date formats be automatically be derived from browser locale. Defaults to `false`. This
|
||||
is an experimental feature right now with a few problems that remain unsolved.
|
||||
|
||||
### default_timezone
|
||||
|
||||
Used as the default timezone for user preferences. Can be either `browser` for the browser local timezone or a timezone name from IANA Time Zone database, e.g. `UTC` or `Europe/Amsterdam` etc.
|
||||
@@ -162,6 +162,12 @@ On Debian 9 (Stretch) the following dependencies have been confirmed as needed f
|
||||
libx11 libcairo bcairo2 libcairo2 libxtst6 libxcomposite1 libx11-xcb1 libxcursor1 libxdamage1 libnss3 libcups libcups2 libXss libXss1 libxss1 libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 libpangocairo-1.0-0 libgtk-3-0
|
||||
```
|
||||
|
||||
On Debian 10 (Buster) the following dependencies have been confirmed as needed for the image rendering to function.
|
||||
|
||||
```bash
|
||||
libxdamage1 libxext6 libxi6 libxtst6 libnss3 libnss3 libcups2 libxss1 libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 libpangocairo-1.0-0 libpango-1.0-0 libcairo2 libatspi2.0-0 libgtk3.0-cil libgdk3.0-cil libx11-xcb-dev
|
||||
```
|
||||
|
||||
**Centos:**
|
||||
|
||||
On a minimal Centos installation, the following dependencies have been confirmed as needed for the image rendering to function:
|
||||
|
||||
19
docs/sources/administration/jaeger-instrumentation.md
Normal file
19
docs/sources/administration/jaeger-instrumentation.md
Normal file
@@ -0,0 +1,19 @@
|
||||
+++
|
||||
title = "Jaeger instrumentation"
|
||||
description = "Jaeger traces emitted and propagation by Grafana"
|
||||
keywords = ["grafana", "jaeger", "tracing"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
parent = "admin"
|
||||
weight = 9
|
||||
+++
|
||||
|
||||
# Jaeger instrumentation
|
||||
|
||||
Grafana supports [Jaeger tracing](https://www.jaegertracing.io/).
|
||||
|
||||
Grafana can emit Jaeger traces for its HTTP API endpoints and propagate Jaeger trace information to data sources.
|
||||
All HTTP endpoints are logged evenly (annotations, dashboard, tags, and so on).
|
||||
When a trace ID is propagated, it is reported with operation 'HTTP /datasources/proxy/:id/*'.
|
||||
|
||||
Refer to [Configuration]({{< relref "configuration.md#tracing-jaeger" >}}) for information about enabling Jaeger tracing.
|
||||
58
docs/sources/administration/preferences.md
Normal file
58
docs/sources/administration/preferences.md
Normal file
@@ -0,0 +1,58 @@
|
||||
+++
|
||||
title = "Change your preferences"
|
||||
description = "How to change your Grafana preferences"
|
||||
keywords = ["grafana", "profile", "change", "preferences"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 100
|
||||
+++
|
||||
|
||||
# Change your Grafana preferences
|
||||
|
||||
You can perform several tasks in the Preferences tab. You can edit your profile, change your Grafana preferences, and view information about your profile and Grafana usage.
|
||||
|
||||
## Edit your Grafana profile
|
||||
|
||||
Your profile includes your name, user name, and email address.
|
||||
|
||||
1. Navigate to the Preferences tab. Hover your cursor over your user icon in the lower left corner of the screen, and then click **Preferences.**
|
||||
1. In the Edit Profile section, you can edit any of the following:
|
||||
- **Name -** Edit this field to change the display name associated with your profile.
|
||||
- **Email -** Edit this field to change the email address associated with your profile.
|
||||
- **Username -** Edit this field to change your user name.
|
||||
1. Click **Save**.
|
||||
|
||||
## Edit your Grafana preferences
|
||||
|
||||
Your Grafana preferences include whether uses the dark or light theme, your home dashboard, and your timezone.
|
||||
|
||||
> **Note:** Settings on your personal instance override settings made by your administrator at the instance or team level.
|
||||
|
||||
1. Navigate to the Preferences tab. Hover your cursor over your user icon in the lower left corner of the screen, and then click **Preferences.**
|
||||
1. In the Preferences section, you can edit any of the following:
|
||||
- **UI Theme -** Click to set the **Dark** or **Light** to select a theme. **Default** is either the dark theme or the theme selected by your Grafana administrator.
|
||||
- **Home Dashboard -** Refer to [Set your personal home dashboard]({{< relref "change-home-dashboard.md#set-your-personal-home-dashboard" >}}) for more information.
|
||||
- **Timezone -** Click to select an option in the **Timezone** list. **Default** is either the browser local timezone or the timezone selected by your Grafana administrator. Refer to [Time range controls]({{< relref "../dashboards/time-range-controls.md" >}}) for more information about Grafana time settings.
|
||||
1. Click **Save**.
|
||||
|
||||
## View your assigned organizations
|
||||
|
||||
Every user is a member of at least one organization. You can have different roles in every organization that you are a member of.
|
||||
|
||||
1. Navigate to the Preferences tab. Hover your cursor over your user icon in the lower left corner of the screen, and then click **Preferences.**
|
||||
1. Scroll down to the Organizations section.
|
||||
- **Name -** The name of the organizations you are a member of in that Grafana instance.
|
||||
- **Role -** The role you are assigned in the organization. Refer to [Organization roles]({{< relref "../permissions/organization_roles.md" >}}) about permissions assigned to each role.
|
||||
- **Current -** Grafana tags the organization that you are currently signed in to as _Current_.
|
||||
|
||||
## View your Grafana sessions
|
||||
|
||||
Grafana logs your sessions in each Grafana instance. You can review this section if you suspect someone has misused your Grafana credentials.
|
||||
|
||||
1. Navigate to the Preferences tab. Hover your cursor over your user icon in the lower left corner of the screen, and then click **Preferences.**
|
||||
1. Scroll down to the Sessions section. Grafana displays the following:
|
||||
- **Last seen -** How long ago you logged on.
|
||||
- **Logged on -** The date you logged on to the current Grafana instance.
|
||||
- **IP address -** The IP address that you logged on from.
|
||||
- **Browser & OS -** The web browser and operating system used to log on to Grafana.
|
||||
- If you are a Grafana Admin for the instance, then you can revoke a session by clicking the red signout icon in the session row.
|
||||
@@ -151,6 +151,7 @@ Since not all datasources have the same configuration settings we only have the
|
||||
| tlsSkipVerify | boolean | _All_ | Controls whether a client verifies the server's certificate chain and host name. |
|
||||
| graphiteVersion | string | Graphite | Graphite version |
|
||||
| timeInterval | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source |
|
||||
| httpMode | string | Influxdb, Prometheus | HTTP Method. 'GET', 'POST', defaults to GET |
|
||||
| esVersion | number | Elasticsearch | Elasticsearch version as a number (2/5/56/60/70) |
|
||||
| timeField | string | Elasticsearch | Which field that should be used as timestamp |
|
||||
| interval | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' |
|
||||
@@ -275,6 +276,8 @@ providers:
|
||||
|
||||
When Grafana starts, it will update/insert all dashboards available in the configured path. Then later on poll that path every **updateIntervalSeconds** and look for updated json files and update/insert those into the database.
|
||||
|
||||
> **Note:** Dashboards are provisioned to the General folder if the `folder` option is missing or empty.
|
||||
|
||||
#### Making changes to a provisioned dashboard
|
||||
|
||||
It's possible to make changes to a provisioned dashboard in the Grafana UI. However, it is not possible to automatically save the changes back to the provisioning source.
|
||||
@@ -307,7 +310,7 @@ By default Grafana will delete dashboards in the database if the file is removed
|
||||
### Provision folders structure from filesystem to Grafana
|
||||
If you already store your dashboards using folders in a git repo or on a filesystem, and also you want to have the same folder names in the Grafana menu, you can use `foldersFromFilesStructure` option.
|
||||
|
||||
For example, to replicate these dashboards structure from the filesystem to Grafana,
|
||||
For example, to replicate these dashboards structure from the filesystem to Grafana,
|
||||
```
|
||||
/etc/dashboards
|
||||
├── /server
|
||||
@@ -320,18 +323,20 @@ For example, to replicate these dashboards structure from the filesystem to Graf
|
||||
you need to specify just this short provision configuration file.
|
||||
```yaml
|
||||
apiVersion: 1
|
||||
|
||||
|
||||
providers:
|
||||
- name: dashboards
|
||||
type: file
|
||||
updateIntervalSeconds: 30
|
||||
options:
|
||||
path: /etc/dashboards
|
||||
foldersFromFileStructure: true
|
||||
foldersFromFilesStructure: true
|
||||
```
|
||||
`server` and `application` will become new folders in Grafana menu.
|
||||
|
||||
> **Note.** `folder` and `folderUid` options should be empty or missing to make `foldersFromFileStructure` works.
|
||||
> **Note.** `folder` and `folderUid` options should be empty or missing to make `foldersFromFilesStructure` work.
|
||||
|
||||
> **Note:** To provision dashboards to the General folder, store them in the root of your `path`.
|
||||
|
||||
## Alert Notification Channels
|
||||
|
||||
@@ -378,12 +383,16 @@ notifiers:
|
||||
send_reminder: true
|
||||
frequency: 1h
|
||||
disable_resolve_message: false
|
||||
# See `Supported Settings` section for settings supporter for each
|
||||
# See `Supported Settings` section for settings supported for each
|
||||
# alert notification type.
|
||||
settings:
|
||||
recipient: 'XXX'
|
||||
token: 'xoxb'
|
||||
uploadImage: true
|
||||
token: 'xoxb' # legacy setting since Grafana v7.2 (stored non-encrypted)
|
||||
url: https://slack.com # legacy setting since Grafana v7.2 (stored non-encrypted)
|
||||
# Secure settings that will be encrypted in the database (supported since Grafana v7.2). See `Supported Settings` section for secure settings supported for each notifier.
|
||||
secure_settings:
|
||||
token: 'xoxb'
|
||||
url: https://slack.com
|
||||
|
||||
delete_notifiers:
|
||||
@@ -399,32 +408,34 @@ delete_notifiers:
|
||||
|
||||
### Supported Settings
|
||||
|
||||
The following sections detail the supported settings for each alert notification type.
|
||||
The following sections detail the supported settings and secure settings for each alert notification type. Secure settings are stored encrypted in the database and you add them to `secure_settings` in the YAML file instead of `settings`.
|
||||
|
||||
> **Note**: Secure settings is supported since Grafana v7.2.
|
||||
|
||||
#### Alert notification `pushover`
|
||||
|
||||
| Name |
|
||||
| -------- |
|
||||
| apiToken |
|
||||
| userKey |
|
||||
| device |
|
||||
| retry |
|
||||
| expire |
|
||||
| Name | Secure setting |
|
||||
| -------- | -------------- |
|
||||
| apiToken | yes |
|
||||
| userKey | yes |
|
||||
| device | |
|
||||
| retry | |
|
||||
| expire | |
|
||||
|
||||
#### Alert notification `slack`
|
||||
|
||||
| Name |
|
||||
| -------------- |
|
||||
| url |
|
||||
| recipient |
|
||||
| username |
|
||||
| icon_emoji |
|
||||
| icon_url |
|
||||
| uploadImage |
|
||||
| mentionUsers |
|
||||
| mentionGroups |
|
||||
| mentionChannel |
|
||||
| token |
|
||||
| Name | Secure setting |
|
||||
| -------------- | -------------- |
|
||||
| url | yes |
|
||||
| recipient | |
|
||||
| username | |
|
||||
| icon_emoji | |
|
||||
| icon_url | |
|
||||
| uploadImage | |
|
||||
| mentionUsers | |
|
||||
| mentionGroups | |
|
||||
| mentionChannel | |
|
||||
| token | yes |
|
||||
|
||||
#### Alert notification `victorops`
|
||||
|
||||
@@ -442,34 +453,34 @@ The following sections detail the supported settings for each alert notification
|
||||
|
||||
#### Alert notification `LINE`
|
||||
|
||||
| Name |
|
||||
| ----- |
|
||||
| token |
|
||||
| Name | Secure setting |
|
||||
| ----- | - |
|
||||
| token | yes |
|
||||
|
||||
#### Alert notification `pagerduty`
|
||||
|
||||
| Name |
|
||||
| -------------- |
|
||||
| integrationKey |
|
||||
| autoResolve |
|
||||
| Name | Secure setting |
|
||||
| -------------- | - |
|
||||
| integrationKey | yes |
|
||||
| autoResolve | |
|
||||
|
||||
#### Alert notification `sensu`
|
||||
|
||||
| Name |
|
||||
| -------- |
|
||||
| url |
|
||||
| source |
|
||||
| handler |
|
||||
| username |
|
||||
| password |
|
||||
| Name | Secure setting |
|
||||
| -------- | - |
|
||||
| url | |
|
||||
| source | |
|
||||
| handler | |
|
||||
| username | |
|
||||
| password | yes |
|
||||
|
||||
#### Alert notification `prometheus-alertmanager`
|
||||
|
||||
| Name |
|
||||
| ----------------- |
|
||||
| url |
|
||||
| basicAuthUser |
|
||||
| basicAuthPassword |
|
||||
| Name | Secure setting |
|
||||
| ----------------- | - |
|
||||
| url | |
|
||||
| basicAuthUser | |
|
||||
| basicAuthPassword | yes |
|
||||
|
||||
#### Alert notification `teams`
|
||||
|
||||
@@ -500,36 +511,36 @@ The following sections detail the supported settings for each alert notification
|
||||
|
||||
#### Alert notification `opsgenie`
|
||||
|
||||
| Name |
|
||||
| ---------------- |
|
||||
| apiKey |
|
||||
| apiUrl |
|
||||
| autoClose |
|
||||
| overridePriority |
|
||||
| Name | Secure setting |
|
||||
| ---------------- | - |
|
||||
| apiKey | yes |
|
||||
| apiUrl | |
|
||||
| autoClose | |
|
||||
| overridePriority | |
|
||||
|
||||
#### Alert notification `telegram`
|
||||
|
||||
| Name |
|
||||
| ----------- |
|
||||
| bottoken |
|
||||
| chatid |
|
||||
| uploadImage |
|
||||
| Name | Secure setting |
|
||||
| ----------- | - |
|
||||
| bottoken | yes |
|
||||
| chatid | |
|
||||
| uploadImage | |
|
||||
|
||||
#### Alert notification `threema`
|
||||
|
||||
| Name |
|
||||
| ------------ |
|
||||
| gateway_id |
|
||||
| recipient_id |
|
||||
| api_secret |
|
||||
| Name | Secure setting |
|
||||
| ------------ | - |
|
||||
| gateway_id | |
|
||||
| recipient_id | |
|
||||
| api_secret | yes |
|
||||
|
||||
#### Alert notification `webhook`
|
||||
|
||||
| Name |
|
||||
| -------- |
|
||||
| url |
|
||||
| username |
|
||||
| password |
|
||||
| Name | Secure setting |
|
||||
| -------- | - |
|
||||
| url | |
|
||||
| username | |
|
||||
| password | yes |
|
||||
|
||||
#### Alert notification `googlechat`
|
||||
|
||||
|
||||
@@ -73,15 +73,18 @@ Telegram | `telegram` | yes | no
|
||||
Threema | `threema` | yes, external only | no
|
||||
VictorOps | `victorops` | yes, external only | no
|
||||
[Webhook](#webhook) | `webhook` | yes, external only | yes
|
||||
[Zenduty](#zenduty) | `webhook` | yes, external only | yes
|
||||
|
||||
### Email
|
||||
|
||||
To enable email notifications you have to setup [SMTP settings]({{< relref "../administration/configuration/#smtp" >}})
|
||||
To enable email notifications you have to set up [SMTP settings]({{< relref "../administration/configuration/#smtp" >}})
|
||||
in the Grafana config. Email notifications will upload an image of the alert graph to an
|
||||
external image destination if available or fallback to attaching the image to the email.
|
||||
Be aware that if you use the `local` image storage email servers and clients might not be
|
||||
able to access the image.
|
||||
|
||||
> **Note:** Template variables are not supported in email alerts.
|
||||
|
||||
Setting | Description
|
||||
---------- | -----------
|
||||
Single email | Send a single email to all recipients. Disabled per default.
|
||||
@@ -122,13 +125,14 @@ Severity | Level for dynamic notifications, default is `critical` (1)
|
||||
Auto resolve incidents | Resolve incidents in PagerDuty once the alert goes back to ok
|
||||
Message in details | Removes the Alert message from the PD summary field and puts it into custom details instead (2)
|
||||
|
||||
>**Note:** The tags `Severity`, `Class`, `Group`, and `Component` have special meaning in the [Pagerduty Common Event Format - PD-CEF](https://support.pagerduty.com/docs/pd-cef). If an alert panel defines these tag keys, then they are transposed to the root of the event sent to Pagerduty. This means they will be available within the Pagerduty UI and Filtering tools. A Severity tag set on an alert overrides the global Severity set on the notification channel if it's a valid level.
|
||||
>**Note:** The tags `Severity`, `Class`, `Group`, `dedup_key`, and `Component` have special meaning in the [Pagerduty Common Event Format - PD-CEF](https://support.pagerduty.com/docs/pd-cef). If an alert panel defines these tag keys, then they are transposed to the root of the event sent to Pagerduty. This means they will be available within the Pagerduty UI and Filtering tools. A Severity tag set on an alert overrides the global Severity set on the notification channel if it's a valid level.
|
||||
|
||||
>Using Message In Details will change the structure of the `custom_details` field in the PagerDuty Event.
|
||||
This might break custom event rules in your PagerDuty rules if you rely on the fields in `payload.custom_details`.
|
||||
Move any existing rules using `custom_details.myMetric` to `custom_details.queries.myMetric`.
|
||||
This behavior will become the default in a future version of Grafana.
|
||||
|
||||
> Using `dedup_key` tag will override grafana generated `dedup_key` with a custom key.
|
||||
### Webhook
|
||||
|
||||
The webhook notification is a simple way to send information about a state change over HTTP to a custom endpoint.
|
||||
@@ -208,6 +212,10 @@ Alertmanager handles alerts sent by client applications such as Prometheus serve
|
||||
|
||||
> **Caution:** In case of a high-availability setup, do not load balance traffic between Grafana and Alertmanagers to keep coherence between all your Alertmanager instances. Instead, point Grafana to a list of all Alertmanagers, by listing their URLs comma-separated in the notification channel configuration.
|
||||
|
||||
### Zenduty
|
||||
|
||||
[Zenduty](https://www.zenduty.com) is an incident alerting and response orchestration platform that not alerts the right teams via SMS, Phone(Voice), Email, Slack, Microsoft Teams and Push notifications(Android/iOS) whenever a Grafana alert is triggered, but also helps you rapidly triage and remediate critical, user impacting incidents. Grafana alert are sent to Zenduty through Grafana's native webhook dispatcher. Refer the Zenduty-Grafana [integration documentation](https://docs.zenduty.com/docs/grafana) for configuring the integration.
|
||||
|
||||
## Enable images in notifications {#external-image-store}
|
||||
|
||||
Grafana can render the panel associated with the alert rule as a PNG image and include that in the notification. Read more about the requirements and how to configure
|
||||
|
||||
@@ -20,32 +20,30 @@ The Azure AD authentication provides the possibility to use an Azure Active Dire
|
||||
|
||||
To enable the Azure AD OAuth2 you must register your application with Azure AD.
|
||||
|
||||
1. Log in to [Azure Portal](https://portal.azure.com) and click **Azure Active Directory** in the side menu.
|
||||
1. Log in to [Azure Portal](https://portal.azure.com) and click **Azure Active Directory** in the side menu. If you have access to more than one tenant, select your account in the upper right. Set your session to the Azure AD tenant you wish to use.
|
||||
|
||||
1. Click **App Registrations** and add a new application registration:
|
||||
- Name: Grafana
|
||||
- Application type: Web app / API
|
||||
- Sign-on URL: `https://<grafana domain>/login/azuread`
|
||||
1. Under **Manage** in the side menu, click **App Registrations** and then **New Registration**. Provide a fitting name.
|
||||
|
||||
1. Click the name of the new application to open the application details page.
|
||||
1. Under **Redirect URI**, select **Web** as the app type.
|
||||
|
||||
1. Click **Endpoints**.
|
||||
- Note down the **OAuth 2.0 authorization endpoint (v2)**, this will be the auth URL.
|
||||
- Note down the **OAuth 2.0 token endpoint (v2)**, this will be the token URL.
|
||||
1. Add the redirect URL `https://<grafana domain>/login/azuread`, then click **Register**.
|
||||
|
||||
1. Close the Endpoints page to come back to the application details page.
|
||||
1. The app's **Overview** page is displayed. Note the **Application ID**, this is the OAuth client id.
|
||||
|
||||
1. Note down the "Application ID", this will be the OAuth client id.
|
||||
1. Click **Endpoints** from the top menu.
|
||||
|
||||
- Note the **OAuth 2.0 authorization endpoint (v2)**, this is the auth URL.
|
||||
- Note the **OAuth 2.0 token endpoint (v2)**, this is the token URL.
|
||||
|
||||
1. Click **Certificates & secrets** and add a new entry under Client secrets.
|
||||
- Description: Grafana OAuth
|
||||
- Expires: Never
|
||||
|
||||
1. Click **Add** then copy the key value, this will be the OAuth client secret.
|
||||
1. Click **Add**, then copy the key value. This is the OAuth client secret.
|
||||
|
||||
1. Click **Manifest**.
|
||||
- Add definitions for the required Application Roles for Grafana (Viewer, Editor, Admin). Without this configuration all users will be assigned to the Viewer role.
|
||||
- Every role has to have a unique id. On Linux this can be created with `uuidgen` for instance.
|
||||
- Add definitions for the required Application Roles for Grafana (Viewer, Editor, Admin). Without this configuration, all users will be assigned the Viewer role.
|
||||
- Every role requires a unique id. On Linux, this can be created with `uuidgen`. For example:
|
||||
|
||||
```json
|
||||
"appRoles": [
|
||||
@@ -88,9 +86,9 @@ To enable the Azure AD OAuth2 you must register your application with Azure AD.
|
||||
],
|
||||
```
|
||||
|
||||
1. Click Overview and then on **Managed application in local directory** to show the Enterprise Application details.
|
||||
1. Go to **Azure Active Directory** and then to **Enterprise Applications**. Search for your application and click on it.
|
||||
|
||||
1. Click on **Users and groups** and add Users/Groups to the Grafana roles by using **Add User**.
|
||||
1. Click on **Users and Groups** and add Users/Groups to the Grafana roles by using **Add User**.
|
||||
|
||||
## Enable Azure AD OAuth in Grafana
|
||||
|
||||
|
||||
@@ -12,8 +12,13 @@ weight = 3
|
||||
|
||||
# Generic OAuth Authentication
|
||||
|
||||
You can configure many different OAuth2 authentication services with Grafana using the generic OAuth2 feature. Below you
|
||||
can find examples using Okta, BitBucket, OneLogin and Azure.
|
||||
You can configure many different OAuth2 authentication services with Grafana using the generic OAuth2 feature. Examples:
|
||||
- [Auth0](#set-up-oauth2-with-auth0)
|
||||
- [Azure AD]({{< relref "azuread.md" >}})
|
||||
- [BitBucket](#set-up-oauth2-with-bitbucket)
|
||||
- [Centrify](#set-up-oauth2-with-centrify)
|
||||
- [Okta]({{< relref "okta.md" >}})
|
||||
- [OneLogin](#set-up-oauth2-with-onelogin)
|
||||
|
||||
This callback URL must match the full HTTP address that you use in your browser to access Grafana, but with the prefix path of `/login/generic_oauth`.
|
||||
|
||||
@@ -33,10 +38,21 @@ token_url =
|
||||
api_url =
|
||||
allowed_domains = mycompany.com mycompany.org
|
||||
allow_sign_up = true
|
||||
tls_skip_verify_insecure = false
|
||||
tls_client_cert =
|
||||
tls_client_key =
|
||||
tls_client_ca =
|
||||
```
|
||||
|
||||
Set `api_url` to the resource that returns [OpenID UserInfo](https://connect2id.com/products/server/docs/api/userinfo) compatible information.
|
||||
|
||||
You can also specify the SSL/TLS configuration used by the client.
|
||||
- Set `tls_client_cert` to the path of the certificate.
|
||||
- Set `tls_client_key` to the path containing the key.
|
||||
- Set `tls_client_ca` to the path containing a trusted certificate authority list.
|
||||
|
||||
`tls_skip_verify_insecure` controls whether a client verifies the server's certificate chain and host name. If it is true, then SSL/TLS accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks.
|
||||
|
||||
Grafana will attempt to determine the user's e-mail address by querying the OAuth provider as described below in the following order until an e-mail address is found:
|
||||
|
||||
1. Check for the presence of an e-mail address via the `email` field encoded in the OAuth `id_token` parameter.
|
||||
@@ -54,6 +70,41 @@ Check for the presence of a role using the [JMESPath](http://jmespath.org/exampl
|
||||
|
||||
See [JMESPath examples](#jmespath-examples) for more information.
|
||||
|
||||
> Only available in Grafana v7.2+.
|
||||
|
||||
Customize user login using `login_attribute_path` configuration option. Order of operations is as follows:
|
||||
|
||||
1. Grafana evaluates the `login_attribute_path` JMESPath expression against the ID token.
|
||||
1. If Grafana finds no value, then Grafana evaluates expression against the JSON data obtained from UserInfo endpoint. The UserInfo endpoint URL is specified in the `api_url` configuration option.
|
||||
|
||||
You can customize the attribute name used to extract the ID token from the returned OAuth token with the `id_token_attribute_name` option.
|
||||
|
||||
## Set up OAuth2 with Auth0
|
||||
|
||||
1. Create a new Client in Auth0
|
||||
- Name: Grafana
|
||||
- Type: Regular Web Application
|
||||
|
||||
2. Go to the Settings tab and set:
|
||||
- Allowed Callback URLs: `https://<grafana domain>/login/generic_oauth`
|
||||
|
||||
3. Click Save Changes, then use the values at the top of the page to configure Grafana:
|
||||
|
||||
```bash
|
||||
[auth.generic_oauth]
|
||||
enabled = true
|
||||
allow_sign_up = true
|
||||
team_ids =
|
||||
allowed_organizations =
|
||||
name = Auth0
|
||||
client_id = <client id>
|
||||
client_secret = <client secret>
|
||||
scopes = openid profile email
|
||||
auth_url = https://<domain>/authorize
|
||||
token_url = https://<domain>/oauth/token
|
||||
api_url = https://<domain>/userinfo
|
||||
```
|
||||
|
||||
## Set up OAuth2 with Bitbucket
|
||||
|
||||
```bash
|
||||
@@ -71,6 +122,37 @@ team_ids =
|
||||
allowed_organizations =
|
||||
```
|
||||
|
||||
## Set up OAuth2 with Centrify
|
||||
|
||||
1. Create a new Custom OpenID Connect application configuration in the Centrify dashboard.
|
||||
|
||||
2. Create a memorable unique Application ID, e.g. "grafana", "grafana_aws", etc.
|
||||
|
||||
3. Put in other basic configuration (name, description, logo, category)
|
||||
|
||||
4. On the Trust tab, generate a long password and put it into the OpenID Connect Client Secret field.
|
||||
|
||||
5. Put the URL to the front page of your Grafana instance into the "Resource Application URL" field.
|
||||
|
||||
6. Add an authorized Redirect URI like https://your-grafana-server/login/generic_oauth
|
||||
|
||||
7. Set up permissions, policies, etc. just like any other Centrify app
|
||||
|
||||
8. Configure Grafana as follows:
|
||||
|
||||
```bash
|
||||
[auth.generic_oauth]
|
||||
name = Centrify
|
||||
enabled = true
|
||||
allow_sign_up = true
|
||||
client_id = <OpenID Connect Client ID from Centrify>
|
||||
client_secret = <your generated OpenID Connect Client Secret"
|
||||
scopes = openid profile email
|
||||
auth_url = https://<your domain>.my.centrify.com/OAuth2/Authorize/<Application ID>
|
||||
token_url = https://<your domain>.my.centrify.com/OAuth2/Token/<Application ID>
|
||||
api_url = https://<your domain>.my.centrify.com/OAuth2/UserInfo/<Application ID>
|
||||
```
|
||||
|
||||
## Set up OAuth2 with OneLogin
|
||||
|
||||
1. Create a new Custom Connector with the following settings:
|
||||
@@ -106,63 +188,6 @@ allowed_organizations =
|
||||
allowed_organizations =
|
||||
```
|
||||
|
||||
## Set up OAuth2 with Auth0
|
||||
|
||||
1. Create a new Client in Auth0
|
||||
- Name: Grafana
|
||||
- Type: Regular Web Application
|
||||
|
||||
2. Go to the Settings tab and set:
|
||||
- Allowed Callback URLs: `https://<grafana domain>/login/generic_oauth`
|
||||
|
||||
3. Click Save Changes, then use the values at the top of the page to configure Grafana:
|
||||
|
||||
```bash
|
||||
[auth.generic_oauth]
|
||||
enabled = true
|
||||
allow_sign_up = true
|
||||
team_ids =
|
||||
allowed_organizations =
|
||||
name = Auth0
|
||||
client_id = <client id>
|
||||
client_secret = <client secret>
|
||||
scopes = openid profile email
|
||||
auth_url = https://<domain>/authorize
|
||||
token_url = https://<domain>/oauth/token
|
||||
api_url = https://<domain>/userinfo
|
||||
```
|
||||
|
||||
## Set up OAuth2 with Centrify
|
||||
|
||||
1. Create a new Custom OpenID Connect application configuration in the Centrify dashboard.
|
||||
|
||||
2. Create a memorable unique Application ID, e.g. "grafana", "grafana_aws", etc.
|
||||
|
||||
3. Put in other basic configuration (name, description, logo, category)
|
||||
|
||||
4. On the Trust tab, generate a long password and put it into the OpenID Connect Client Secret field.
|
||||
|
||||
5. Put the URL to the front page of your Grafana instance into the "Resource Application URL" field.
|
||||
|
||||
6. Add an authorized Redirect URI like https://your-grafana-server/login/generic_oauth
|
||||
|
||||
7. Set up permissions, policies, etc. just like any other Centrify app
|
||||
|
||||
8. Configure Grafana as follows:
|
||||
|
||||
```bash
|
||||
[auth.generic_oauth]
|
||||
name = Centrify
|
||||
enabled = true
|
||||
allow_sign_up = true
|
||||
client_id = <OpenID Connect Client ID from Centrify>
|
||||
client_secret = <your generated OpenID Connect Client Secret"
|
||||
scopes = openid profile email
|
||||
auth_url = https://<your domain>.my.centrify.com/OAuth2/Authorize/<Application ID>
|
||||
token_url = https://<your domain>.my.centrify.com/OAuth2/Token/<Application ID>
|
||||
api_url = https://<your domain>.my.centrify.com/OAuth2/UserInfo/<Application ID>
|
||||
```
|
||||
|
||||
## JMESPath examples
|
||||
|
||||
To ease configuration of a proper JMESPath expression, you can test/evaluate expressions with custom payloads at http://jmespath.org/.
|
||||
|
||||
@@ -59,11 +59,13 @@ Example:
|
||||
# Login cookie name
|
||||
login_cookie_name = grafana_session
|
||||
|
||||
# The lifetime (days) an authenticated user can be inactive before being required to login at next visit. Default is 7 days.
|
||||
login_maximum_inactive_lifetime_days = 7
|
||||
|
||||
# The maximum lifetime (days) an authenticated user can be logged in since login time before being required to login. Default is 30 days.
|
||||
login_maximum_lifetime_days = 30
|
||||
# The maximum lifetime (duration) an authenticated user can be inactive before being required to login at next visit. Default is 7 days (7d). This setting should be expressed as a duration, e.g. 5m (minutes), 6h (hours), 10d (days), 2w (weeks), 1M (month). The lifetime resets at each successful token rotation (token_rotation_interval_minutes).
|
||||
login_maximum_inactive_lifetime_duration =
|
||||
|
||||
|
||||
# The maximum lifetime (duration) an authenticated user can be logged in since login time before being required to login. Default is 30 days (30d). This setting should be expressed as a duration, e.g. 5m (minutes), 6h (hours), 10d (days), 2w (weeks), 1M (month).
|
||||
login_maximum_lifetime_duration =
|
||||
|
||||
# How often should auth tokens be rotated for authenticated users when being active. The default is each 10 minutes.
|
||||
token_rotation_interval_minutes = 10
|
||||
|
||||
11
docs/sources/best-practices/_index.md
Normal file
11
docs/sources/best-practices/_index.md
Normal file
@@ -0,0 +1,11 @@
|
||||
+++
|
||||
title = "Best practices"
|
||||
description = "Best practices for working with Grafana"
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 200
|
||||
+++
|
||||
|
||||
# Best practices
|
||||
|
||||
This section provides information about best practices for intermediate Grafana administrators and users.
|
||||
@@ -0,0 +1,55 @@
|
||||
+++
|
||||
title = "Best practices for creating dashboards"
|
||||
description = "Best practices for creating dashboards in Grafana"
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 200
|
||||
+++
|
||||
|
||||
# Best practices for creating dashboards
|
||||
|
||||
This page outlines some best practices to follow when creating Grafana dashboards.
|
||||
|
||||
## Before you begin
|
||||
|
||||
Here are some principles to consider before you create a dashboard.
|
||||
|
||||
### A dashboard should tell a story or answer a question
|
||||
|
||||
What story are you trying to tell with your dashboard? Try to create a logical progression of data, such as large to small or general to specific. What is the goal for this dashboard? (Hint: If the dashboard doesn't have a goal, then ask yourself if you really need the dashboard.)
|
||||
|
||||
Keep your graphs simple and focused on answering the question that you are asking. For example, if your question is "which servers are in trouble?", then maybe you don't need to show all the server data. Just show data for the ones in trouble.
|
||||
|
||||
### Dashboards should reduce cognitive load, not add to it
|
||||
|
||||
_Cognitive load_ is basically how hard you need to think about something in order to figure it out. Make your dashboard easy to interpret. Other users and future you (when you're trying to figure out what broke at 2AM) will appreciate it.
|
||||
|
||||
Ask yourself:
|
||||
- Can I tell what exactly each graph represents? Is it obvious, or do I have to think about it?
|
||||
- If I show this to someone else, how long will it take them to figure it out? Will they get lost?
|
||||
|
||||
### Have a monitoring strategy
|
||||
|
||||
It's easy to make new dashboards. It's harder to optimize dashboard creation and adhere to a plan, but it's worth it. This strategy should govern both your overall dashboard scheme and enforce consistency in individual dashboard design.
|
||||
|
||||
Refer to [Common observability strategies]({{< relref "common-observability-strategies.md" >}}) and [Dashboard management maturity levels]({{< relref "dashboard-management-maturity-levels.md" >}}) for more information.
|
||||
|
||||
### Write it down
|
||||
|
||||
Once you have a strategy or design guidelines, write them down to help maintain consistency over time. Check out this [Wikimedia runbook example](https://wikitech.wikimedia.org/wiki/Performance/Runbook/Grafana_best_practices).
|
||||
|
||||
## Best practices to follow
|
||||
|
||||
- When creating a new dashboard, make sure it has a meaningful name.
|
||||
- If you are creating a dashboard to play or experiment, then put the word `TEST` or `TMP` in the name.
|
||||
- Consider including your name or initials in the dashboard name or as a tag so that people know who owns the dashboard.
|
||||
- Remove temporary experiment dashboards when you are done with them.
|
||||
- If you create many related dashboards, think about how to cross-reference them for easy navigation. Refer to [Best practices for managing dashboards]({{< relref "best-practices-for-managing-dashboards.md" >}}) for more information.
|
||||
- Grafana retrieves data from a data source. A basic understanding of [data sources]({{< relref "../features/datasources/data-sources.md" >}}) in general and your specific is important.
|
||||
- Avoid unnecessary dashboard refreshing to reduce the load on the network or backend. For example, if your data changes every hour, then you don't need to set the dashboard refresh rate to 30 seconds.
|
||||
- Use the left and right Y-axes when displaying time series with different units or ranges.
|
||||
- Add documentation to dashboards and panels.
|
||||
- To add documentation to a dashboard, add a [Text panel visualization]({{< relref "../panels/visualizations/text-panel.md" >}}) to the dashboard. Record things like the purpose of the dashboard, useful resource links, and any instructions users might need to interact with the dashboard. Check out this [Wikimedia example](https://grafana.wikimedia.org/d/000000066/resourceloader?orgId=1).
|
||||
- To add documentation to a panel, [edit the panel settings]({{< relref "../panels/add-a-panel.md#edit-panel-settings" >}}) and add a description. Any text you add will appear if you hover your cursor over the small `i` in the top left corner of the panel.
|
||||
- Reuse your dashboards and enforce consistency by using [templates and variables]({{< relref "../variables/templates-and-variables.md" >}}).
|
||||
- Be careful with stacking graph data. The visualizations can be misleading, and hide important data. We recommend turning it off in most cases.
|
||||
@@ -0,0 +1,39 @@
|
||||
+++
|
||||
title = "Best practices for managing dashboards"
|
||||
description = "Best practices for managing dashboards in Grafana"
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 200
|
||||
+++
|
||||
|
||||
# Best practices for managing dashboards
|
||||
|
||||
This page outlines some best practices to follow when managing Grafana dashboards.
|
||||
|
||||
## Before you begin
|
||||
|
||||
Here are some principles to consider before you start managing dashboards.
|
||||
|
||||
### Strategic observability
|
||||
|
||||
There are several [common observability strategies]({{< relref "common-observability-strategies.md" >}}). You should research them and decide whether one of them works for you or if you want to come up with your own. Either way, have a plan, write it down, and stick to it.
|
||||
|
||||
Adapt your strategy to changing needs as necessary.
|
||||
|
||||
### Maturity level
|
||||
|
||||
What is your dashboard maturity level? Analyze your current dashboard setup and compare it to the [Dashboard management maturity model]({{< relref "dashboard-management-maturity-levels.md" >}}). Understanding where you are can help you decide how to get to where you want to be.
|
||||
|
||||
## Best practices to follow
|
||||
|
||||
- Avoid dashboard sprawl, meaning the uncontrolled growth of dashboards. Dashboard sprawl negatively affects time to find the right dashboard. Duplicating dashboards and changing “one thing” (worse: keeping original tags) is the easiest kind of sprawl.
|
||||
- Periodically review the dashboards and remove unnecessary ones.
|
||||
- If you create a temporary dashboard, perhaps to test something, prefix the name with `TEST: `. Delete the dashboard when you are finished.
|
||||
- Copying dashboards with no significant changes is not a good idea.
|
||||
- You miss out on updates to the original dashboard, such as documentation changes, bug fixes, or additions to metrics.
|
||||
- In many cases copies are being made to simply customize the view by setting template parameters. This should instead be done by maintaining a link to the master dashboard and customizing the view with [URL parameters]({{< relref "../linking/data-link-variables.md" >}}).
|
||||
- When you must copy a dashboard, clearly rename it and _do not_ copy the dashboard tags. Tags are important metadata for dashboards that are used during search. Copying tags can result in false matches.
|
||||
- Maintain a dashboard of dashboards or cross-reference dashboards. This can be done in several ways:
|
||||
- Create dashboard links, panel, or data links. Links can go to other dashboards or to external systems. For more information, refer to [Linking]({{< relref "../linking/_index.md" >}}).
|
||||
- Add a [Dashboard list panel]({{< relref "../panels/visualizations/dashboard-list-panel.md" >}}). You can then customize what you see by doing tag or folder searches.
|
||||
- Add a [Text panel]({{< relref "../panels/visualizations/text-panel.md" >}}) and use markdown to customize the display.
|
||||
@@ -0,0 +1,57 @@
|
||||
+++
|
||||
title = "Common observability strategies"
|
||||
description = "Common observability strategies"
|
||||
keywords = ["grafana", "intro", "guide", "concepts", "methods"]
|
||||
aliases = ["/docs/grafana/latest/getting-started/strategies/"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 500
|
||||
+++
|
||||
|
||||
# Common observability strategies
|
||||
|
||||
When you have a lot to monitor, like a server farm, you need a strategy to decide what is important enough to monitor. This page describes several common methods for choosing what to monitor.
|
||||
|
||||
A logical strategy allows you to make uniform dashboards and scale your observability platform more easily.
|
||||
|
||||
## Guidelines for usage
|
||||
|
||||
- The USE method tells you how happy your machines are, the RED method tells you how happy your users are.
|
||||
- USE reports on causes of issues.
|
||||
- RED reports on user experience and is more likely to report symptoms of problems.
|
||||
- The best practice of alerting is to alert on symptoms rather than causes, so alerting should be done on RED dashboards.
|
||||
|
||||
## USE method
|
||||
|
||||
USE stands for:
|
||||
|
||||
- **Utilization -** Percent time the resource is busy, such as node CPU usage
|
||||
- **Saturation -** Amount of work a resource has to do, often queue length or node load
|
||||
- **Errors -** Count of error events
|
||||
|
||||
This method is best for hardware resources in infrastructure, such as CPU, memory, and network devices. For more information, refer to [The USE Method](http://www.brendangregg.com/usemethod.html).
|
||||
|
||||
## RED method
|
||||
|
||||
RED stands for:
|
||||
|
||||
- **Rate -** Requests per second
|
||||
- **Errors -** Number of requests that are failing
|
||||
- **Duration -** Amount of time these requests take, distribution of latency measurements
|
||||
|
||||
This method is most applicable to services, especially a microservices environment. For each of your services, instrument the code to expose these metrics for each component. RED dashboards are good for alerting and SLAs. A well-designed RED dashboard is a proxy for user experience.
|
||||
|
||||
For more information, refer to Tom Wilkie's blog post [The RED method: How to instrument your services](https://grafana.com/blog/2018/08/02/the-red-method-how-to-instrument-your-services).
|
||||
|
||||
## The Four Golden Signals
|
||||
|
||||
According to the [Google SRE handbook](https://landing.google.com/sre/sre-book/chapters/monitoring-distributed-systems/#xref_monitoring_golden-signals), if you can only measure four metrics of your user-facing system, focus on these four.
|
||||
|
||||
This method is similar to the RED method, but it includes saturation.
|
||||
|
||||
- **Latency -** Time taken to serve a request
|
||||
- **Traffic -** How much demand is placed on your system
|
||||
- **Errors -** Rate of requests that are failing
|
||||
- **Saturation -** How "full" your system is
|
||||
|
||||
[Here's an example from Grafana Play](https://play.grafana.org/d/000000109/the-four-golden-signals?orgId=1).
|
||||
@@ -0,0 +1,73 @@
|
||||
+++
|
||||
title = "Dashboard management maturity model"
|
||||
description = "Explanation of dashboard management maturity model"
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
weight = 200
|
||||
+++
|
||||
|
||||
# Dashboard management maturity model
|
||||
|
||||
_Dashboard management maturity_ refers to how well-designed and efficient your dashboard ecosystem is. We recommend periodically reviewing your dashboard setup to gauge where you are and how you can improve.
|
||||
|
||||
Broadly speaking, dashboard maturity can be defined as low, medium, or high.
|
||||
|
||||
Much of the content for this topic was taken from the KubeCon 2019 talk [Fool-Proof Kubernetes Dashboards for Sleep-Deprived Oncalls](https://www.youtube.com/watch?v=YE2aQFiMGfY).
|
||||
|
||||
## Low - default state
|
||||
|
||||
At this stage, you have no coherent dashboard management strategy. Almost everyone starts here.
|
||||
|
||||
How can you tell you are here?
|
||||
|
||||
- Everyone can modify your dashboards.
|
||||
- Lots of copied dashboards, little to no dashboard reuse.
|
||||
- One-off dashboards that hang around forever.
|
||||
- No version control (dashboard JSON in version control).
|
||||
- Lots of browsing for dashboards, searching for the right dashboard. This means lots of wasted time trying to find the dashboard you need.
|
||||
- Not having any alerts to direct you to the right dashboard.
|
||||
|
||||
## Medium - methodical dashboards
|
||||
|
||||
At this stage, you are starting to manage your dashboard use with methodical dashboards. You might have laid out a strategy, but there are some things you could improve.
|
||||
|
||||
How can you tell you are here?
|
||||
|
||||
- Prevent sprawl by using template variables. For example, you don't need a separate dashboard for each node, you can use query variables. Even better, you can make the data source a template variable too, so you can reuse the same dashboard across different clusters and monitoring backends.
|
||||
|
||||
Refer to the list of [Variable examples]({{< relref "../variables/variable-examples.md" >}}) if you want some ideas.
|
||||
|
||||
- Methodical dashboards according to an [observability strategy]({{< relref "common-observability-strategies.md" >}}).
|
||||
- Hierarchical dashboards with drill-downs to the next level.
|
||||
|
||||
{{< imgbox max-width="100%" img="/img/docs/best-practices/drill-down-example.png" caption="Example of using drill-down" >}}
|
||||
|
||||
- Dashboard design reflects service hierarchies. The example shown below uses the RED method (request and error rate on the left, latency duration on the right) with one row per service. The row order reflects the data flow.
|
||||
|
||||
{{< imgbox max-width="100%" img="/img/docs/best-practices/service-hierarchy-example.png" caption="Example of a service hierarchy" >}}
|
||||
|
||||
- Compare like to like: split service dashboards when the magnitude differs. Make sure aggregated metrics don't drown out important information.
|
||||
- Expressive charts with meaningful use of color and normalizing axes where you can.
|
||||
- Example of meaningful color: Blue means it's good, red means it's bad. [Thresholds]({{< relref "../panels/thresholds.md" >}}) can help with that.
|
||||
- Example of normalizing axes: When comparing CPU usage, measure by percentage rather than raw number, because machines can have a different number of cores. Normalizing CPU usage by the number of cores reduces cognitive load because the viewer can trust that at 100% all cores are being used, without having to know the number of CPUs.
|
||||
- Directed browsing cuts down on "guessing."
|
||||
- Template variables make it harder to “just browse” randomly or aimlessly.
|
||||
- Most dashboards should be linked to by alerts.
|
||||
- Browsing is directed with links. For more information, refer to [Linking]({{< relref "../linking/_index.md" >}}).
|
||||
- Version-controlled dashboard JSON.
|
||||
|
||||
## High - optimized use
|
||||
|
||||
At this stage, you have optimized your dashboard management use with a consistent and thoughtful strategy. It requires maintenance, but the results are worth it.
|
||||
|
||||
- Actively reducing sprawl.
|
||||
- Regularly review existing dashboards to make sure they are still relevant.
|
||||
- Only approved dashboards added to master dashboard list.
|
||||
- Tracking dashboard use. If you're an Enterprise user, you might take advantage of [Usage insights]({{< relref "../enterprise/usage-insights.md" >}}).
|
||||
- Consistency by design.
|
||||
- Use scripting libraries to generate dashboards, ensure consistency in pattern and style.
|
||||
- grafonnet (Jsonnet)
|
||||
- grafanalib (Python)
|
||||
- No editing in the browser. Dashboard viewers change views with variables.
|
||||
- Browsing for dashboards is the exception, not the rule.
|
||||
- Perform experimentation and testing in a separate Grafana instance dedicated to that purpose, not your production instance. When a dashboard in the test environment is proven useful, then add that dashboard to your main Grafana instance.
|
||||
@@ -13,13 +13,15 @@ weight = 3
|
||||
|
||||
Folders are a way to organize and group dashboards - very useful if you have a lot of dashboards or multiple teams using the same Grafana instance.
|
||||
|
||||
> **Note:** Only Grafana Admins and Super Admins can create, edit, or delete folders. Refer to [Organization roles]({{< relref "../permissions/organization_roles.md" >}}) for more information.
|
||||
|
||||
## How To Create A Folder
|
||||
|
||||
- Create a folder by using the Create Folder link in the side menu (under the create menu (+ icon))
|
||||
- Use the create Folder button on the Manage Dashboards page.
|
||||
- When saving a dashboard, you can either choose a folder for the dashboard to be saved in or create a new folder
|
||||
|
||||
On the Create Folder page, fill in a unique name for the folder and press Create.
|
||||
On the Create Folder page, fill in a unique name for the folder and then click Create.
|
||||
|
||||
## Manage Dashboards
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
+++
|
||||
title = "Developers"
|
||||
type = "docs"
|
||||
aliases = ["/docs/plugins/developing/"]
|
||||
+++
|
||||
|
||||
# Developers
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
+++
|
||||
title = "Build a plugin"
|
||||
title = "Build a plugin."
|
||||
type = "docs"
|
||||
+++
|
||||
|
||||
@@ -32,6 +32,7 @@ If you're looking to build your first plugin, check out these introductory tutor
|
||||
|
||||
- [Build a panel plugin]({{< relref "../../../../../tutorials/build-a-panel-plugin.md" >}})
|
||||
- [Build a data source plugin]({{< relref "../../../../../tutorials/build-a-data-source-plugin.md" >}})
|
||||
- [Build a data source backend plugin]({{< relref "../../../../../tutorials/build-a-data-source-backend-plugin.md" >}})
|
||||
|
||||
Ready to learn more? Check out our other tutorials:
|
||||
|
||||
@@ -47,6 +48,7 @@ Improve an existing plugin with one of our guides:
|
||||
- [Add support for variables]({{< relref "add-support-for-variables.md" >}})
|
||||
- [Build a logs data source plugin]({{< relref "build-a-logs-data-source-plugin.md" >}})
|
||||
- [Build a streaming data source plugin]({{< relref "build-a-streaming-data-source-plugin.md" >}})
|
||||
- [Error handling]({{< relref "error-handling.md" >}})
|
||||
|
||||
### Concepts
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ Let users write custom annotation queries to only display the annotation events
|
||||
|
||||
> **Note**: Annotation query editors have yet to receive support for React. The instructions here are given for Angular. Fortunately, you can run Angular even in a plugin otherwise written using React. This section will be updated once React support for annotation queries editors is available.
|
||||
|
||||
1. Create a file called `AnnotationQueryEditor.ts` in the plugin root directory, with the following content.
|
||||
1. Create a file called `AnnotationQueryEditor.ts` in the `src` directory, with the following content.
|
||||
|
||||
```ts
|
||||
export class AnnotationQueryEditor {
|
||||
@@ -94,12 +94,12 @@ Let users write custom annotation queries to only display the annotation events
|
||||
annotation: any;
|
||||
|
||||
constructor() {
|
||||
this.annotation.rawQuery = this.annotation.rawQuery || '';
|
||||
this.annotation.queryText = this.annotation.queryText || '';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
1. Create a directory called `partials` in the plugin root directory.
|
||||
1. Create a directory called `partials` in the `src` directory.
|
||||
|
||||
1. Create a file called `annotations.editor.html` in the `partials` directory you just created, with the following content.
|
||||
|
||||
|
||||
@@ -51,10 +51,152 @@ For data sources, you need to use the [getTemplateSrv]({{< relref "../../package
|
||||
|
||||
```ts
|
||||
async query(options: DataQueryRequest<MyQuery>): Promise<DataQueryResponse> {
|
||||
const query = getTemplateSrv().replace('SELECT * FROM services WHERE id = "$service"'), options.scopedVars);
|
||||
const query = getTemplateSrv().replace('SELECT * FROM services WHERE id = "$service"', options.scopedVars);
|
||||
|
||||
const data = makeDbQuery(query);
|
||||
|
||||
return { data };
|
||||
}
|
||||
```
|
||||
|
||||
## Format multi-value variables
|
||||
|
||||
When a user selects multiple values for variable, the value of the interpolated variable depends on the [variable format](https://grafana.com/docs/grafana/latest/variables/advanced-variable-format-options/).
|
||||
|
||||
A data source can define the default format option when no format is specified by adding a third argument to the interpolation function.
|
||||
|
||||
Let's change the SQL query to use CSV format by default:
|
||||
|
||||
```ts
|
||||
getTemplateSrv().replace('SELECT * FROM services WHERE id IN ($service)', options.scopedVars, "csv");
|
||||
```
|
||||
|
||||
Now, when users write `$service`, the query looks like this:
|
||||
|
||||
```sql
|
||||
SELECT * FROM services WHERE id IN (admin,auth,billing)
|
||||
```
|
||||
|
||||
For more information on the available variable formats, refer to [Advanced variable format options](https://grafana.com/docs/grafana/latest/variables/advanced-variable-format-options/).
|
||||
|
||||
## Set a variable from your plugin
|
||||
|
||||
Not only can you read the value of a variable, you can also update the variable from your plugin. Use [LocationSrv.update()]({{< relref "../../packages_api/runtime/locationsrv.md/#update-method" >}}) to update a variable using query parameters.
|
||||
|
||||
The following example shows how to update a variable called `service`.
|
||||
|
||||
- `query` contains the query parameters you want to update. Query parameters controlling variables are prefixed with `var-`.
|
||||
- `partial: true` makes the update only affect the query parameters listed in `query`, and leaves the other query parameters unchanged.
|
||||
- `replace: true` tells Grafana to update the current URL state, rather than creating a new history entry.
|
||||
|
||||
```ts
|
||||
import { getLocationSrv } from '@grafana/runtime';
|
||||
```
|
||||
|
||||
```ts
|
||||
getLocationSrv().update({
|
||||
query: {
|
||||
'var-service': 'billing',
|
||||
},
|
||||
partial: true,
|
||||
replace: true,
|
||||
});
|
||||
```
|
||||
|
||||
> **Note:** Grafana queries your data source whenever you update a variable. Excessive updates to variables can slow down Grafana and lead to a poor user experience.
|
||||
|
||||
## Add support for query variables to your data source
|
||||
|
||||
[Query variables]({{< relref "../../variables/variable-types/add-query-variable.md" >}}) is a type of variable that allows you to query a data source for the values. By adding support for query variables to your data source plugin, users can create dynamic dashboards based on data from your data source.
|
||||
|
||||
Let's start by defining a query model for the variable query.
|
||||
|
||||
```ts
|
||||
export interface MyVariableQuery {
|
||||
namespace: string;
|
||||
rawQuery: string;
|
||||
}
|
||||
```
|
||||
|
||||
For a data source to support query variables, you must override the [`metricFindQuery`]({{< relref "../../packages_api/data/datasourceapi.md#metricfindquery-method" >}}) in your `DataSourceApi` class. `metricFindQuery` returns an array of [`MetricFindValue`]({{< relref "../../packages_api/data/metricfindvalue.md" >}}) which has a single property, `text`:
|
||||
|
||||
```ts
|
||||
async metricFindQuery(query: MyVariableQuery, options?: any) {
|
||||
// Retrieve DataQueryResponse based on query.
|
||||
const response = await this.fetchMetricNames(query.namespace, query.rawQuery);
|
||||
|
||||
// Convert query results to a MetricFindValue[]
|
||||
const values = response.data.map(frame => ({ text: frame.name }));
|
||||
|
||||
return values;
|
||||
}
|
||||
```
|
||||
|
||||
> **Note:** By default, Grafana provides a default query model and editor for simple text queries. If that's all you need, then you can leave the query type as `string`.
|
||||
>
|
||||
> ```ts
|
||||
> async metricFindQuery(query: string, options?: any)
|
||||
> ```
|
||||
|
||||
Let's create a custom query editor to allow the user to edit the query model.
|
||||
|
||||
1. Create a `VariableQueryEditor` component.
|
||||
|
||||
```ts
|
||||
import React, { useState } from 'react';
|
||||
import { MyVariableQuery } from './types';
|
||||
|
||||
interface VariableQueryProps {
|
||||
query: MyVariableQuery;
|
||||
onChange: (query: MyVariableQuery, definition: string) => void;
|
||||
}
|
||||
|
||||
export const VariableQueryEditor: React.FC<VariableQueryProps> = ({ onChange, query }) => {
|
||||
const [state, setState] = useState(query);
|
||||
|
||||
const saveQuery = () => {
|
||||
onChange(state, `${state.query} (${state.namespace})`);
|
||||
};
|
||||
|
||||
const handleChange = (event: React.FormEvent<HTMLInputElement>) =>
|
||||
setState({
|
||||
...state,
|
||||
[event.currentTarget.name]: event.currentTarget.value,
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="gf-form">
|
||||
<span className="gf-form-label width-10">Namespace</span>
|
||||
<input
|
||||
name="namespace"
|
||||
className="gf-form-input"
|
||||
onBlur={saveQuery}
|
||||
onChange={handleChange}
|
||||
value={state.namespace}
|
||||
/>
|
||||
</div>
|
||||
<div className="gf-form">
|
||||
<span className="gf-form-label width-10">Query</span>
|
||||
<input name="rawQuery" className="gf-form-input" onBlur={saveQuery} onChange={handleChange} value={state.rawQuery} />
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
Grafana saves the query model whenever one of the text fields loses focus (`onBlur`) and then previews the values returned by `metricFindQuery`.
|
||||
|
||||
The second argument to `onChange` allows you to set a text representation of the query which will appear next to the name of the variable in the variables list.
|
||||
|
||||
1. Finally, configure your plugin to use the query editor.
|
||||
|
||||
```ts
|
||||
import { VariableQueryEditor } from './VariableQueryEditor';
|
||||
|
||||
export const plugin = new DataSourcePlugin<DataSource, MyQuery, MyDataSourceOptions>(DataSource)
|
||||
.setQueryEditor(QueryEditor)
|
||||
.setVariableQueryEditor(VariableQueryEditor);
|
||||
```
|
||||
|
||||
That's it! You can now try out the plugin by adding a [query variable]({{< relref "../../variables/variable-types/add-query-variable.md" >}}) to your dashboard.
|
||||
|
||||
64
docs/sources/developers/plugins/error-handling.md
Normal file
64
docs/sources/developers/plugins/error-handling.md
Normal file
@@ -0,0 +1,64 @@
|
||||
+++
|
||||
title = "Error handling"
|
||||
type = "docs"
|
||||
+++
|
||||
|
||||
# Error handling
|
||||
|
||||
This guide explains how to handle errors in plugins.
|
||||
|
||||
## Provide usable defaults
|
||||
|
||||
Allow the user to learn your plugin in small steps. Provide a useful default configuration so that:
|
||||
|
||||
- The user can get started right away.
|
||||
- You can avoid unnecessary error messages.
|
||||
|
||||
For example, by selecting the first field of an expected type, the panel can display a visualization without any user configuration. If a user explicitly selects a field, then use that one. Otherwise, default to the first field of type `string`:
|
||||
|
||||
```ts
|
||||
const numberField = frame.fields.find(field =>
|
||||
options.numberFieldName ? field.name === options.numberFieldName : field.type === FieldType.number
|
||||
);
|
||||
```
|
||||
|
||||
## Display error messages
|
||||
|
||||
To display an error message to the user, `throw` an `Error` with the message you want to display:
|
||||
|
||||
```ts
|
||||
throw new Error('An error occurred');
|
||||
```
|
||||
|
||||
Grafana displays the error message in the top-left corner of the panel.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/panel_error.png" class="docs-image--no-shadow" max-width="850px" >}}
|
||||
|
||||
Avoid displaying overly-technical error messages to the user. If you want to let technical users report an error, consider logging it instead.
|
||||
|
||||
```ts
|
||||
try {
|
||||
failingFunction();
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
throw new Error('Something went wrong');
|
||||
}
|
||||
```
|
||||
|
||||
> **Note:** Grafana displays the exception message in the UI as written, so we recommend using grammatically correct sentences. For more information, refer to the [Documentation style guide](https://github.com/grafana/grafana/blob/master/contribute/style-guides/documentation-style-guide.md).
|
||||
|
||||
Here are some examples of situations where you might want to display an error to the user.
|
||||
|
||||
### Invalid query response
|
||||
|
||||
Users have full freedom when they create data source queries for panels. If your panel plugin requires a specific format for the query response, then use the panel canvas to guide the user.
|
||||
|
||||
```ts
|
||||
if (!numberField) {
|
||||
throw new Error('Query result is missing a number field')
|
||||
}
|
||||
|
||||
if (frame.length === 0) {
|
||||
throw new Error('Query returned an empty result')
|
||||
}
|
||||
```
|
||||
@@ -35,6 +35,7 @@ The plugin.json file is required for all plugins. When Grafana starts, it scans
|
||||
| `partials` | [object](#partials) | No | |
|
||||
| `queryOptions` | [object](#queryoptions) | No | For data source plugins. There is a query options section in the plugin's query editor and these options can be turned on if needed. |
|
||||
| `routes` | [object](#routes)[] | No | For data source plugins. Proxy routes used for plugin authentication and adding headers to HTTP requests made by the plugin. For more information, refer to [Authentication for data source plugins](https://grafana.com/docs/grafana/latest/developers/plugins/authentication/). |
|
||||
| `skipDataQuery` | boolean | No | For panel plugins. Hides the query editor. |
|
||||
| `sort` | number | No | Internal property for sorting. Cannot be used as will be overwritten by Grafana. |
|
||||
| `staticRoot` | string | No | |
|
||||
| `streaming` | boolean | No | For data source plugins. If the plugin supports streaming. |
|
||||
@@ -47,10 +48,11 @@ Plugin dependencies.
|
||||
|
||||
### Properties
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
|------------------|----------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `grafanaVersion` | string | **Yes** | Required Grafana version for this plugin, e.g. `6.x.x 7.x.x` to denote plugin requires Grafana v6.x.x or v7.x.x. |
|
||||
| `plugins` | string[] | No | An array of required plugins on which this plugin depends. |
|
||||
| Property | Type | Required | Description |
|
||||
|---------------------|----------|----------|-------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `grafanaDependency` | string | **Yes** | Required Grafana version for this plugin. Validated using https://github.com/npm/node-semver. |
|
||||
| `grafanaVersion` | string | No | (Deprecated) Required Grafana version for this plugin, e.g. `6.x.x 7.x.x` to denote plugin requires Grafana v6.x.x or v7.x.x. |
|
||||
| `plugins` | string[] | No | An array of required plugins on which this plugin depends. |
|
||||
|
||||
## includes
|
||||
|
||||
|
||||
168
docs/sources/developers/plugins/migration-guide.md
Normal file
168
docs/sources/developers/plugins/migration-guide.md
Normal file
@@ -0,0 +1,168 @@
|
||||
+++
|
||||
title = "Plugin migration guide"
|
||||
type = "docs"
|
||||
+++
|
||||
|
||||
# Plugin migration guide
|
||||
|
||||
This guide explains how to migrate pre-Grafana 7.0 plugins from Angular to the new React-based plugin platform introduced in Grafana 7.0.
|
||||
|
||||
It's written for:
|
||||
|
||||
- Plugin authors who want to migrate their plugins to Grafana 7.0+.
|
||||
- Plugin users who are using custom plugins and want to know whether they can upgrade to Grafana 7.0 without losing functionality.
|
||||
|
||||
> If you've successfully migrated your plugin from Angular to React, please [submit an issue on GitHub](https://github.com/grafana/grafana/issues/new?title=Docs%20feedback:%20/developers/plugins/migration-guide.md) and share your experiences with us so that we can improve this guide!
|
||||
|
||||
## What's new in Grafana 7.0?
|
||||
|
||||
Grafana 7.0 introduced a whole new plugin platform based on React. The new platform supersedes the previous Angular-based plugin platform.
|
||||
|
||||
Plugins built using Angular still work for the foreseeable future, but we encourage new plugin authors to develop with the new platform.
|
||||
|
||||
### New data format
|
||||
|
||||
Along with the move to React, the new plugin platform introduced a new internal data format called [data frames]({{< relref "data-frames.md" >}}).
|
||||
|
||||
Previously, data source plugins could send data either as time series or tables. With data frames, data sources can send any data in a table-like structure. This gives you more flexibility to visualize your data in Grafana.
|
||||
|
||||
### Improved TypeScript support
|
||||
|
||||
While the previous Angular-based plugin SDK did support TypeScript, for the React platform, we’ve greatly improved the support. All our APIs are now TypeScript, which might require existing code to update to the new stricter type definitions. Grafana 7.0 also introduced several new APIs for plugin developers that take advantage of many of the new features in Grafana 7.0.
|
||||
|
||||
### Grafana Toolkit
|
||||
|
||||
With Grafana 7.0, we released a new tool for making it easier to develop plugins. Before, you’d use Gulp, Grunt, or similar tools to generate the minified assets. Grafana Toolkit takes care of building and testing your plugin without complicated configuration files.
|
||||
|
||||
For more information, refer to [@grafana/toolkit](https://www.npmjs.com/package/@grafana/toolkit).
|
||||
|
||||
### Field configuration options
|
||||
|
||||
Grafana 7.0 introduced the concept of [_field configuration options_]({{< relref "../../panels/field-configuration-options.md#field-configuration-options" >}}), a new way of configuring your data before it gets visualized. Since this was not available in previous versions, any plugin that enables field-based configuration will not work in previous versions of Grafana.
|
||||
|
||||
For plugins prior to Grafana 7.0, all options are considered _Display options_. The tab for field configuration isn't available.
|
||||
|
||||
### Backend plugins
|
||||
|
||||
While backend plugins were available as an experimental feature in previous versions of Grafana, the support has been greatly improved for Grafana 7. Backend plugins for Grafana 7.0 are backwards-compatible and will continue to work. However, the old backend plugin system has been deprecated, and we recommend that you use the new SDK for backend plugins.
|
||||
|
||||
Since Grafana 7.0 introduced [signing of backend plugins]({{< relref "../../plugins/plugin-signature-verification.md" >}}), community plugins won’t load by default if they’re unsigned.
|
||||
|
||||
To learn more, refer to [Backend plugins]({{< relref "backend" >}}).
|
||||
|
||||
## Why should I migrate my plugin?
|
||||
|
||||
There are several benefits in using the new plugin platform.
|
||||
|
||||
- **Better performance:** Components written in React are more responsive.
|
||||
- **Support for field configuration options:** By migrating to the new data frame format, you can leverage the new field configuration options to let users customize their data and display options.
|
||||
|
||||
## Compatibility between Grafana versions
|
||||
|
||||
A plugin developed for Grafana 6 will work for Grafana 7.0. However, plugins developed using the new plugin platform in Grafana 7.0 will only work for Grafana 7.0 and up.
|
||||
|
||||
### Interoperability between data formats
|
||||
|
||||
Grafana detects the data format sent by the data source and transforms it for the panel, if needed.
|
||||
|
||||
For example:
|
||||
|
||||
- A legacy panel with data source that returns data frames: Grafana converts the response to the legacy format.
|
||||
- A legacy data source with a panel using data frames: Grafana converts the response to the data frame format.
|
||||
- If both panel and data source uses the same format, no transformations are made. Data is passed as is.
|
||||
|
||||
### target and jsonData are unchanged
|
||||
|
||||
The query model, `target`, and the configuration model, jsonData, are still the same. This means that if you use the same query model and configuration for your plugin, then the migrated plugin will use existing queries and configuration. You don’t have to worry about breaking existing dashboards.
|
||||
|
||||
## Migrate a plugin from Angular to React
|
||||
|
||||
If you’re looking to migrate a plugin to the new plugin platform, then we recommend that you release it under a new major version. Consider keeping a release branch for the previous version to be able to roll out patch releases for versions prior to Grafana 7.
|
||||
|
||||
While there's no 1-to-1 migration path from an Angular plugin to the new React platform, from early adopters, we’ve learned that one of the easiest ways to migrate is to:
|
||||
|
||||
1. Create a new branch called `migrate-to-react`.
|
||||
1. Start from scratch with one of the templates provided by Grafana Toolkit.
|
||||
1. Move the existing code into the new plugin incrementally, one component at a time.
|
||||
|
||||
### Migrate a panel plugin
|
||||
|
||||
Prior to Grafana 7.0, you would export a MetricsPanelCtrl from module.ts.
|
||||
|
||||
**src/module.ts**
|
||||
|
||||
```ts
|
||||
import { MetricsPanelCtrl } from 'grafana/app/plugins/sdk';
|
||||
|
||||
class MyPanelCtrl extends MetricsPanelCtrl {
|
||||
// ...
|
||||
}
|
||||
|
||||
export { MyPanelCtrl as PanelCtrl };
|
||||
```
|
||||
|
||||
Starting with 7.0, plugins now export a PanelPlugin from module.ts where MyPanel is a React component containing the props from PanelProps.
|
||||
|
||||
**src/module.ts**
|
||||
|
||||
```ts
|
||||
import { PanelPlugin } from '@grafana/data';
|
||||
|
||||
export const plugin = new PanelPlugin<MyOptions>(MyPanel);
|
||||
```
|
||||
|
||||
**src/MyPanel.tsx**
|
||||
|
||||
```ts
|
||||
import { PanelProps } from '@grafana/data';
|
||||
|
||||
interface Props extends PanelProps<SimpleOptions> {}
|
||||
|
||||
export const MyPanel: React.FC<Props> = ({ options, data, width, height }) => {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### Migrate a data source plugin
|
||||
|
||||
While all plugins are different, we'd like to share a migration process that has worked for some of our users.
|
||||
|
||||
1. Define you configuration model and `ConfigEditor`. For many plugins, the config editor is the simplest component so it's a good candidate to start with.
|
||||
1. Implement the `testDatasource()` method on the class that extends `DataSourceApi` using the settings in your configuration model to make sure you can successfully configure and access the external API.
|
||||
1. Implement the `query()` method. At this point, you can hard-code your query, because we haven’t yet implemented the query editor. The `query()` method supports both the new data frame response and the old TimeSeries response, so don’t worry about converting to the new format just yet.
|
||||
1. Implement the `QueryEditor`. How much work this requires depends on how complex your query model is.
|
||||
|
||||
By now, you should be able to release your new version.
|
||||
|
||||
To fully migrate to the new plugin platform, convert the time series response to a data frame response.
|
||||
|
||||
### Migrate to data frames
|
||||
|
||||
Before 7.0, data source and panel plugins exchanged data using either time series or tables. Starting with 7.0, plugins use the new data frame format to pass data from data sources to panels.
|
||||
|
||||
Grafana 7.0 is backward compatible with the old data format used in previous versions. Panels and data sources using the old format will still work with plugins using the new data frame format.
|
||||
|
||||
The `DataQueryResponse` returned by the `query` method can be either a [LegacyResponseData](https://grafana.com/docs/grafana/latest/packages_api/data/legacyresponsedata/) or a [DataFrame](https://grafana.com/docs/grafana/latest/packages_api/data/dataframe/).
|
||||
|
||||
The [toDataFrame()](https://grafana.com/docs/grafana/latest/packages_api/data/todataframe/) function converts a legacy response, such as `TimeSeries` or `Table`, to a `DataFrame`. Use it to gradually move your code to the new format.
|
||||
|
||||
```ts
|
||||
import { toDataFrame } from '@grafana/data';
|
||||
```
|
||||
|
||||
```ts
|
||||
async query(options: DataQueryRequest<MyQuery>): Promise<DataQueryResponse> {
|
||||
return {
|
||||
data: options.targets.map(query => {
|
||||
const timeSeries: TimeSeries = await doLegacyRequest(query);
|
||||
return toDataFrame(timeSeries);
|
||||
}
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
For more information, refer to [Data frames](https://grafana.com/docs/grafana/latest/developers/plugins/data-frames/).
|
||||
|
||||
## Troubleshoot plugin migration
|
||||
|
||||
With Grafana 7.0, backend plugins can now be cryptographically signed to verify their origin. By default, Grafana will ignore unsigned plugins. For more information, refer to [Allow unsigned plugins]({{< relref "../../plugins/plugin-signature-verification.md#allow-unsigned-plugins" >}}).
|
||||
@@ -7,10 +7,14 @@
|
||||
"required": ["type", "name", "id", "info", "dependencies"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"$schema": {
|
||||
"type": "string",
|
||||
"description": "Schema definition for the plugin.json file"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Unique name of the plugin. If the plugin is published on grafana.com, then the plugin id has to follow the naming conventions.",
|
||||
"pattern": "^[0-9a-z\\-]+$"
|
||||
"pattern": "^[0-9a-z]+\\-([0-9a-z]+\\-)?(app|panel|datasource)$"
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
@@ -23,8 +27,8 @@
|
||||
},
|
||||
"category": {
|
||||
"type": "string",
|
||||
"description": "Plugin category used on the Add data source page. Possible values are: `tsdb`, `logging`, `cloud`, `tracing`, and `sql`.",
|
||||
"enum": ["tsdb", "logging", "cloud", "tracing", "sql"]
|
||||
"description": "Plugin category used on the Add data source page. Possible values are: `tsdb`, `logging`, `cloud`, `tracing`, `sql`, `enterprise` and `other`.",
|
||||
"enum": ["tsdb", "logging", "cloud", "tracing", "sql", "enterprise", "other"]
|
||||
},
|
||||
"annotations": {
|
||||
"type": "boolean",
|
||||
@@ -73,6 +77,10 @@
|
||||
"type": "boolean",
|
||||
"description": "For data source plugins. If the plugin supports logs."
|
||||
},
|
||||
"skipDataQuery": {
|
||||
"type": "boolean",
|
||||
"description": "For panel plugins. Hides the query editor."
|
||||
},
|
||||
"partials": {
|
||||
"type": "object",
|
||||
"additionalItems": false,
|
||||
@@ -117,13 +125,18 @@
|
||||
"dependencies": {
|
||||
"type": "object",
|
||||
"description": "Plugin dependencies.",
|
||||
"required": ["grafanaVersion"],
|
||||
"required": ["grafanaDependency"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"grafanaVersion": {
|
||||
"type": "string",
|
||||
"description": "Required Grafana version for this plugin, e.g. `6.x.x 7.x.x` to denote plugin requires Grafana v6.x.x or v7.x.x.",
|
||||
"pattern": "^([0-9x]+\\.[0-9x]+\\.*[0-9x]*\\s*)+$"
|
||||
"description": "(Deprecated) Required Grafana version for this plugin, e.g. `6.x.x 7.x.x` to denote plugin requires Grafana v6.x.x or v7.x.x.",
|
||||
"pattern": "^([0-9]+)(\\.[0-9x]+)?(\\.[0-9x])?$"
|
||||
},
|
||||
"grafanaDependency": {
|
||||
"type": "string",
|
||||
"description": "Required Grafana version for this plugin. Validated using https://github.com/npm/node-semver.",
|
||||
"pattern": "^(<=|>=|<|>|=|~|\\^)?([0-9]+)(\\.[0-9x\\*]+)(\\.[0-9x\\*])?(\\s(<=|>=|<|=>)?([0-9]+)(\\.[0-9x]+)(\\.[0-9x]))?$"
|
||||
},
|
||||
"plugins": {
|
||||
"type": "array",
|
||||
@@ -137,7 +150,7 @@
|
||||
"info": {
|
||||
"type": "object",
|
||||
"description": "Metadata for the plugin. Some fields are used on the plugins page in Grafana and others on grafana.com if the plugin is published.",
|
||||
"required": ["logos", "version", "updated"],
|
||||
"required": ["logos", "version", "updated", "keywords"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"author": {
|
||||
@@ -168,6 +181,7 @@
|
||||
"keywords": {
|
||||
"type": "array",
|
||||
"description": "Array of plugin keywords. Used for search on grafana.com.",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
@@ -270,8 +284,7 @@
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "For data source plugins. Route URL is where the request is proxied to.",
|
||||
"format": "uri"
|
||||
"description": "For data source plugins. Route URL is where the request is proxied to."
|
||||
},
|
||||
"reqSignedIn": {
|
||||
"type": "boolean"
|
||||
|
||||
120
docs/sources/developers/plugins/share-a-plugin.md
Normal file
120
docs/sources/developers/plugins/share-a-plugin.md
Normal file
@@ -0,0 +1,120 @@
|
||||
+++
|
||||
title = "Share a plugin"
|
||||
type = "docs"
|
||||
+++
|
||||
|
||||
# Share a plugin
|
||||
|
||||
You've just built your first plugin, and now you want to share it with the world. In this guide, you'll learn how to package and share your plugin with others.
|
||||
|
||||
When you build a plugin from source, a `dist` directory is created that contains the production build, or _plugin assets_, for your plugin.
|
||||
|
||||
When loading your plugin, Grafana only cares about the plugin assets. Specifically, when the Grafana server starts, it attempts to discover and load plugins like this:
|
||||
|
||||
1. Look for a `plugin.json` file in any of the subdirectories in the plugin directory.
|
||||
1. If a `plugin.json` was found, try to load the plugin assets from a `dist` directory in the same directory as the `plugin.json` file.
|
||||
1. If there's no `dist` directory, try to load the plugin assets from the same directory as the `plugin.json` file.
|
||||
|
||||
Now that you know what Grafana needs to load your plugin, let's see how you can share the plugin with other users.
|
||||
|
||||
The best way to share your plugin with the world is to publish it on [Grafana Plugins](https://grafana.com/plugins). However, if you're not ready to make your plugin public just yet, you can still share your plugin by hosting the plugin yourself.
|
||||
|
||||
## Publish your plugin on Grafana.com
|
||||
|
||||
To publish a plugin to [Grafana Plugins](https://grafana.com/grafana/plugins), your plugin first needs to be publicly available in a commit on [GitHub](https://github.com).
|
||||
|
||||
The commit you submit needs to either:
|
||||
|
||||
- Contain a `dist` directory with the plugin assets
|
||||
- Contain the plugin assets in the root directory
|
||||
|
||||
We strongly recommend that you don't check in the plugin assets to the main branch. Instead, use the following steps to create a release branch that contains the plugin assets.
|
||||
|
||||
1. Create a release branch.
|
||||
|
||||
```
|
||||
git checkout -b release-0.1.x
|
||||
```
|
||||
|
||||
1. Build the plugin assets.
|
||||
|
||||
```
|
||||
yarn build
|
||||
```
|
||||
|
||||
1. Add the `dist` directory. The `-f` flag adds the directory even if it's ignored by `.gitignore`.
|
||||
|
||||
```
|
||||
git add -f dist
|
||||
```
|
||||
|
||||
1. Create the release commit.
|
||||
|
||||
```
|
||||
git commit -m "Release v0.1.0"
|
||||
```
|
||||
|
||||
1. Create a release tag. You can also [create the release on GitHub](https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository). If you do, then you can skip this step and the next one.
|
||||
|
||||
```
|
||||
git tag -a v0.1.0 -m "Create release tag v0.1.0"
|
||||
```
|
||||
|
||||
1. Push to GitHub. `follow-tags` tells Git to push the release tag along with our release branch.
|
||||
|
||||
```
|
||||
git push --set-upstream origin release-0.1.x --follow-tags
|
||||
```
|
||||
|
||||
The next step is to submit the URL to your repository, and the release commit, to the [Grafana Plugin Repository](https://github.com/grafana/grafana-plugin-repository).
|
||||
|
||||
## Host the plugin yourself
|
||||
|
||||
If you want to share your plugin by hosting it yourself, then we recommend that you package it by adding the plugin assets to a .zip archive. You can then make the archive available by hosting it yourself.
|
||||
|
||||
How you package the plugin depends on whether you want to include the source code or not.
|
||||
|
||||
### Package the plugin with source code
|
||||
|
||||
If you want to distribute the source code along with your plugin assets, then you can archive the entire plugin directory.
|
||||
|
||||
To create a .zip archive that contains the plugin assets and source code, run the following commands in your terminal:
|
||||
|
||||
```
|
||||
cd my-plugin/
|
||||
yarn build
|
||||
zip my-plugin-0.2.0.src.zip . -r -x "node_modules/*" -x ".git/*"
|
||||
```
|
||||
|
||||
### Package the plugin without source code
|
||||
|
||||
If you don't want to distribute the plugin with the source code, then you can archive the `dist` directory.
|
||||
|
||||
To create a .zip archive that only contains the bare minimum to load the plugin, run the following commands in your terminal:
|
||||
|
||||
```
|
||||
cd my-plugin/
|
||||
yarn build
|
||||
cd dist/
|
||||
zip my-plugin-0.2.0.nosrc.zip . -r
|
||||
```
|
||||
|
||||
### Package and host your plugin using GitHub
|
||||
|
||||
If you host your plugin on GitHub, then you can share the plugin using the following URL:
|
||||
|
||||
```
|
||||
https://github.com/GITHUB_USERNAME/GITHUB_REPO_NAME/archive/<VERSION>.zip
|
||||
```
|
||||
|
||||
For example, you can download the [Worldmap Panel](https://github.com/grafana/worldmap-panel) using the following URL:
|
||||
|
||||
[https://github.com/grafana/worldmap-panel/archive/v0.3.2.zip](https://github.com/grafana/worldmap-panel/archive/v0.3.2.zip)
|
||||
|
||||
### Install a packaged plugin
|
||||
|
||||
After the user has downloaded the archive containing the plugin assets, they can install it by extracting the archive into their plugin directory.
|
||||
|
||||
```
|
||||
unzip my-plugin-0.2.0.zip -d YOUR_PLUGIN_DIR/my-plugin
|
||||
```
|
||||
@@ -13,9 +13,7 @@ weight = 100
|
||||
|
||||
Grafana Enterprise is a commercial edition of Grafana that includes additional features not found in the open source version.
|
||||
|
||||
Building on everything you already know and love about Grafana, Grafana Enterprise adds enterprise data sources, advanced authentication options, more permission controls, 24x7x365 support, and training from the core Grafana team.
|
||||
|
||||
Grafana Enterprise includes all of the features found in the open source edition and more.
|
||||
Building on everything you already know and love about Grafana, Grafana Enterprise includes [exclusive datasource plugins]({{< relref "#enterprise-plugins">}}) and [additional features]({{< relref "#enterprise-features">}}). On top of that you get 24x7x365 support and training from the core Grafana team.
|
||||
|
||||
[Learn more about Grafana Enterprise.](https://grafana.com/enterprise)
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@ When permissions are enabled for a data source in an organization, you restrict
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
> **Caution:** Enabling permissions for the default data source makes users not listed in the permissions unable to invoke queries. Panels using default data source will return `Access denied to data source` error for those users.
|
||||
|
||||
## Allow users and teams to query a data source
|
||||
|
||||
{{< docs-imagebox img="/img/docs/enterprise/datasource_permissions_add_still.png" class="docs-image--no-shadow docs-image--right" max-width= "600px" animated-gif="/img/docs/enterprise/datasource_permissions_add.gif" >}}
|
||||
|
||||
@@ -28,32 +28,40 @@ If your license has expired most of Grafana keeps working as normal. Some enterp
|
||||
4. Replace the current `license.jwt`-file with the one you've just downloaded.
|
||||
5. Restart Grafana.
|
||||
|
||||
## Data source permissions
|
||||
## If your license expires
|
||||
|
||||
If your Grafana Enterprise license expires, the following functionality affected as follows.
|
||||
|
||||
### Data source permissions
|
||||
|
||||
Your current data source permissions will keep working as expected, but you'll be unable to add new data source permissions until the license has been renewed.
|
||||
|
||||
## LDAP authentication
|
||||
### LDAP authentication
|
||||
|
||||
* LDAP synchronization is not affected by an expired license.
|
||||
* Enhanced LDAP debugging is unavailable.
|
||||
|
||||
## SAML authentication
|
||||
### SAML authentication
|
||||
|
||||
SAML authentication is not affected by an expired license.
|
||||
|
||||
## Reporting
|
||||
### Reporting
|
||||
|
||||
* You're unable to configure new reports or generate previews.
|
||||
* Scheduled reports are not generated or sent.
|
||||
|
||||
## Enterprise plugins
|
||||
### Enterprise plugins
|
||||
|
||||
Enterprise plugins might stop working.
|
||||
|
||||
## White labeling
|
||||
### White labeling
|
||||
|
||||
The white labeling feature is turned off, meaning that any white labeling options will not have any effect.
|
||||
|
||||
## Usage insights
|
||||
### Usage insights
|
||||
|
||||
All the usage insights features are turned off, meaning that you won't be able to look at dashboard usage, presence indicator or to use improved search. Grafana still collects usage data and you will have access to it as soon as you update your license.
|
||||
|
||||
### Vault integration
|
||||
|
||||
Vault integration is not affected by an expired license.
|
||||
|
||||
@@ -31,26 +31,30 @@ Currently only Organization Admins can create reports.
|
||||
1. Click on the reports icon in the side menu. The Reports tab allows you to view, create, and update your reports.
|
||||
1. Enter report information. All fields are required unless otherwise indicated.
|
||||
* **Name -** Name of the report as you want it to appear in the Reports list.
|
||||
* **Choose dashboard -** Select the dashboard to generate the report from.
|
||||
* **Source dashboard -** Select the dashboard to generate the report from.
|
||||
* **Recipients -** Enter the emails of the people or teams that you want to receive the report.
|
||||
* **Reply to -** (optional) The address that will appear in the **Reply to** field of the email.
|
||||
* **Custom message -** (optional) Message body in the email with the report.
|
||||
1. **Preview** the report to make sure it appears as you expect. Update if necessary
|
||||
1. Select the layout option for generated report: **Portrait** or **Landscape**.
|
||||
* **Message -** (optional) Message body in the email with the report.
|
||||
* **Time range -** (optional) Use custom time range for the report. For more information check [Report time range]({{< relref "#report-time-range" >}}).
|
||||
1. **Preview PDF**to make sure the report appears as you expect. Update if necessary.
|
||||
1. Enter scheduling information. Options vary depending on the frequency you select.
|
||||
1. Select the orientation option for generated report: **Portrait** or **Landscape**.
|
||||
1. Select the layout option for generated report: **Simple** or **Grid**.
|
||||
1. **Save** the report.
|
||||
1. **Send test mail** after saving the report to verify that the whole configuration is working as expected.
|
||||
1. **Send test email** to verify that the whole configuration is working as expected.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/enterprise/reports_create_new.png" max-width="500px" class="docs-image--no-shadow" >}}
|
||||
|
||||
### Layout
|
||||
### Layout and orientation
|
||||
|
||||
> We're actively working on developing new report layout options. [Contact us](https://grafana.com/contact?about=grafana-enterprise&topic=design-process&value=reporting) if you would like to get involved in the design process.
|
||||
|
||||
Name | Support | Description | Preview
|
||||
---- | ------- | ----------- | -------
|
||||
Portrait | v6.4+ | Portrait generates an A4 page in portrait mode with three panels per page. | {{< docs-imagebox img="/img/docs/enterprise/reports_portrait_preview.png" max-width="500px" max-height="500px" class="docs-image--no-shadow" >}}
|
||||
Landscape | v6.7+ | Landscape generates an A4 page in landscape mode with a single panel per page. | {{< docs-imagebox img="/img/docs/enterprise/reports_landscape_preview.png" max-width="500px" class="docs-image--no-shadow" >}}
|
||||
Layout | Orientation | Support | Description | Preview
|
||||
------ | ----------- | ------- | ----------- | -------
|
||||
Simple | Portrait | v6.4+ | Generates an A4 page in portrait mode with three panels per page. | {{< docs-imagebox img="/img/docs/enterprise/reports_portrait_preview.png" max-width="500px" max-height="500px" class="docs-image--no-shadow" >}}
|
||||
Simple | Landscape | v6.7+ | Generates an A4 page in landscape mode with a single panel per page. | {{< docs-imagebox img="/img/docs/enterprise/reports_landscape_preview.png" max-width="500px" class="docs-image--no-shadow" >}}
|
||||
Grid | Portrait | v7.2+ | Generates an A4 page in portrait mode with panels arranged in the same way as at the original dashboard. | {{< docs-imagebox img="/img/docs/enterprise/reports_grid_portrait_preview.png" max-width="500px" max-height="500px" class="docs-image--no-shadow" >}}
|
||||
Grid | Landscape | v7.2+ | Generates an A4 page in landscape mode with panels arranged in the same way as at the original dashboard. | {{< docs-imagebox img="/img/docs/enterprise/reports_grid_landscape_preview.png" max-width="500px" class="docs-image--no-shadow" >}}
|
||||
|
||||
### Scheduling
|
||||
|
||||
@@ -69,7 +73,7 @@ Hourly reports are generated once per hour. All fields are required.
|
||||
|
||||
Daily reports are generated once per day. All fields are required.
|
||||
|
||||
* **Time -** Time of day in 24 hours format when the report should be sent.
|
||||
* **Time -** Time the report is sent, in 24-hour format.
|
||||
* **Time zone -** Time zone for the **Time** field.
|
||||
|
||||
#### Weekly
|
||||
@@ -77,7 +81,17 @@ Daily reports are generated once per day. All fields are required.
|
||||
Weekly reports are generated once per week. All fields are required.
|
||||
|
||||
* **Day -** Weekday which the report should be sent on.
|
||||
* **Time -** Time of day in 24 hours format when the report should be sent.
|
||||
* **Time -** Time the report is sent, in 24-hour format.
|
||||
* **Time zone -** Time zone for the **Time** field.
|
||||
|
||||
#### Monthly
|
||||
|
||||
> Only available in Grafana Enterprise v7.1+.
|
||||
|
||||
Monthly reports are generated once per month. All fields are required.
|
||||
|
||||
* **Day in month -** Day of the month when the report should be sent. You can select `last` for reports that should go out on the last day of the month.
|
||||
* **Time -** Time the report is sent, in 24-hour format.
|
||||
* **Time zone -** Time zone for the **Time** field.
|
||||
|
||||
#### Never
|
||||
@@ -86,11 +100,11 @@ Weekly reports are generated once per week. All fields are required.
|
||||
|
||||
Reports which are scheduled to never be sent have no parameter and will not be sent to the scheduler. They may be manually generated from the **Send test email** prompt or via the [Reporting API]({{< relref "../http_api/reporting.md" >}}).
|
||||
|
||||
### Send test mail
|
||||
### Send test email
|
||||
|
||||
> Only available in Grafana Enterprise v7.0+.
|
||||
|
||||
1. In the report, click **Send test mail**.
|
||||
1. In the report, click **Send test email**.
|
||||
1. In the Email field, enter the email address or addresses that you want to test, separated by semicolon.
|
||||
If you want to use email addresses from the report, then select the **Use emails from report** check box.
|
||||
1. Click **Send**.
|
||||
@@ -109,7 +123,7 @@ When generating reports, each panel renders separately before being collected in
|
||||
|
||||
To modify the panels' clarity you can set a scale factor for the rendered images. A higher scale factor is more legible but will increase the file size of the generated PDF.
|
||||
|
||||
These options are available in the [configuration]({{< relref "../administration/configuration.md">}}) file.
|
||||
These options are available in the [configuration]({{< relref "../administration/configuration.md">}}) file.
|
||||
|
||||
```ini
|
||||
[reporting]
|
||||
@@ -124,12 +138,35 @@ image_scale_factor = 2
|
||||
|
||||
## Report time range
|
||||
|
||||
Reports use the saved time range of the dashboard. Changing the time range of the report is done by saving a modified time range to the dashboard.
|
||||
> Setting custom report time range is available in Grafana Enterprise v7.2+.
|
||||
|
||||
By default, reports use the saved time range of the dashboard. Changing the time range of the report can be done by:
|
||||
- Saving a modified time range to the dashboard.
|
||||
- Setting a time range via **Time range** field in the report form. If specified, then this custom time range overrides the one from the report's dashboard.
|
||||
|
||||
The page header of the report displays the time range for the dashboard's data queries. Dashboards set to use the browser's time zone will use the time zone on the Grafana server.
|
||||
|
||||
If the time zone is set differently between your Grafana server and its remote image renderer, then the time ranges in the report might be different between the page header and the time axes in the panels. We advise always setting the time zone to UTC for dashboards when using a remote renderer to avoid this.
|
||||
|
||||
## Reports settings
|
||||
|
||||
> Only available in Grafana Enterprise v7.2+.
|
||||
|
||||
You can configure organization-wide report settings in the **Settings** tab on the **Reporting** page. Settings are applied to all the reports for current organization.
|
||||
|
||||
You can customize the branding options.
|
||||
|
||||
Report branding:
|
||||
**Company logo URL** - Company logo displayed in the report PDF. Defaults to the Grafana logo.
|
||||
|
||||
Email branding:
|
||||
- **Company logo URL** - Company logo displayed in the report PDF. Defaults to the Grafana logo.
|
||||
- **Email footer** - Toggle to enable report email footer. Select **Sent by** or **None**.
|
||||
- **Footer link text** - Text for the link in the report email footer. Defaults to "Grafana".
|
||||
- **Footer link URL** - Link for the report email footer.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/enterprise/reports_settings.png" max-width="500px" class="docs-image--no-shadow" >}}
|
||||
|
||||
## Troubleshoot reporting
|
||||
|
||||
To troubleshoot and get more log information, enable debug logging in the configuration file. Refer to [Configuration]({{< relref "../administration/configuration.md#filters" >}}) for more information.
|
||||
|
||||
@@ -187,7 +187,7 @@ With the [`allowed_organizations`]({{< relref "./enterprise-configuration.md#all
|
||||
enabled = true
|
||||
certificate_path = "/path/to/certificate.cert"
|
||||
private_key_path = "/path/to/private_key.pem"
|
||||
metadata_path = "/my/metadata.xml"
|
||||
idp_metadata_path = "/my/metadata.xml"
|
||||
max_issue_delay = 90s
|
||||
metadata_valid_duration = 48h
|
||||
assertion_attribute_name = displayName
|
||||
|
||||
@@ -41,6 +41,7 @@ In addition to the data sources that you have configured in your Grafana, there
|
||||
- **Mixed -** Select this to query multiple data sources in the same panel. When this data source is selected, Grafana allows you to select a data source for every new query that you add.
|
||||
* The first query will use the data source that was selected before you selected **Mixed**.
|
||||
* You cannot change an existing query to use the Mixed Data Source.
|
||||
* Grafana Play example: [Mixed data sources](https://play.grafana.org/d/000000100/mixed-datasources?orgId=1)
|
||||
- **Dashboard -** Select this to use a result set from another panel in the same dashboard.
|
||||
|
||||
## Data source plugins
|
||||
|
||||
@@ -12,7 +12,7 @@ weight = 2
|
||||
|
||||
Before you create your first dashboard, you need to add your data source. Following are the list of instructions to create one.
|
||||
|
||||
> Only users with the Admin role can add data sources.
|
||||
> **Note:** Only users with the organization Admin role can add data sources.
|
||||
|
||||
1. Move your cursor to the cog on the side menu which will show you the configuration menu. If the side menu is not visible click the Grafana icon in the upper left corner. Click on **Configuration** > **Data Sources** in the side menu and you'll be taken to the data sources page
|
||||
where you can add and edit data sources. You can also click the cog.
|
||||
|
||||
@@ -21,9 +21,9 @@ The Azure Monitor data source supports multiple services in the Azure cloud:
|
||||
- **[Azure Monitor]({{< relref "#querying-the-azure-monitor-service" >}})** is the platform service that provides a single source for monitoring Azure resources.
|
||||
- **[Application Insights]({{< relref "#querying-the-application-insights-service" >}})** is an extensible Application Performance Management (APM) service for web developers on multiple platforms and can be used to monitor your live web application - it will automatically detect performance anomalies.
|
||||
- **[Azure Log Analytics]({{< relref "#querying-the-azure-log-analytics-service" >}})** (or Azure Logs) gives you access to log data collected by Azure Monitor.
|
||||
- **[Application Insights Analytics]({{< relref "#writing-analytics-queries-for-the-application-insights-service" >}})** allows you to query [Application Insights data](https://docs.microsoft.com/en-us/azure/azure-monitor/app/analytics) using the same query language used for Azure Log Analytics.
|
||||
- **[Application Insights Analytics]({{< relref "#query-the-application-insights-analytics-service" >}})** allows you to query [Application Insights data](https://docs.microsoft.com/en-us/azure/azure-monitor/app/analytics) using the same query language used for Azure Log Analytics.
|
||||
|
||||
## Adding the data source
|
||||
## Add the data source
|
||||
|
||||
The data source can access metrics from four different services. You can configure access to the services that you use. It is also possible to use the same credentials for multiple services if that is how you have set it up in Azure AD.
|
||||
|
||||
@@ -76,10 +76,13 @@ In the query editor for a panel, after choosing your Azure Monitor data source,
|
||||
- `Azure Monitor`
|
||||
- `Application Insights`
|
||||
- `Azure Log Analytics`
|
||||
- `Insights Analytics`
|
||||
|
||||
The query editor will change depending on which one you pick. Azure Monitor is the default.
|
||||
The query editor changes depending on which one you pick. Azure Monitor is the default.
|
||||
|
||||
## Querying the Azure Monitor service
|
||||
Starting in Grafana 7.1, Insights Analytics replaced the former edit mode from within Application Insights.
|
||||
|
||||
## Query the Azure Monitor service
|
||||
|
||||
The Azure Monitor service provides metrics for all the Azure services that you have running. It helps you understand how your applications on Azure are performing and to proactively find issues affecting your applications.
|
||||
|
||||
@@ -93,29 +96,34 @@ Examples of metrics that you can get from the service are:
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v60/azuremonitor-service-query-editor.png" class="docs-image--no-shadow" caption="Azure Monitor Query Editor" >}}
|
||||
|
||||
### Formatting legend keys with aliases for Azure Monitor
|
||||
As of Grafana 7.1, the query editor allows you to query multiple dimensions for metrics that support them. Metrics that support multiple dimensions are those listed in the [Azure Monitor supported Metrics List](https://docs.microsoft.com/en-us/azure/azure-monitor/platform/metrics-supported) that have one or more values listed in the "Dimension" column for the metric.
|
||||
|
||||
### Format legend keys with aliases for Azure Monitor
|
||||
|
||||
The default legend formatting for the Azure Monitor API is:
|
||||
|
||||
`resourceName{dimensionValue=dimensionName}.metricName`
|
||||
`metricName{dimensionName=dimensionValue,dimensionTwoName=DimensionTwoValue}`
|
||||
|
||||
These can be quite long but this formatting can be changed using aliases. In the Legend Format field, the aliases which are defined below can be combined any way you want.
|
||||
> **Note:** Before Grafana 7.1, the formatting included the resource name in the default: `resourceName{dimensionName=dimensionValue}.metricName`. As of Grafana 7.1, the resource name has been removed from the default legend.
|
||||
|
||||
Azure Monitor Examples:
|
||||
These can be quite long, but this formatting can be changed by using aliases. In the **Legend Format** field, you can combine the aliases defined below any way you want.
|
||||
|
||||
- `dimension: {{dimensionvalue}}`
|
||||
- `{{resourcegroup}} - {{resourcename}}`
|
||||
Azure Monitor examples:
|
||||
|
||||
- `Blob Type: {{ blobtype }}`
|
||||
- `{{ resourcegroup }} - {{ resourcename }}`
|
||||
|
||||
### Alias patterns for Azure Monitor
|
||||
|
||||
- `{{resourcegroup}}` = replaced with the value of the Resource Group
|
||||
- `{{namespace}}` = replaced with the value of the Namespace (e.g. Microsoft.Compute/virtualMachines)
|
||||
- `{{resourcename}}` = replaced with the value of the Resource Name
|
||||
- `{{metric}}` = replaced with metric name (e.g. Percentage CPU)
|
||||
- `{{dimensionname}}` = replaced with dimension key/label (e.g. blobtype)
|
||||
- `{{dimensionvalue}}` = replaced with dimension value (e.g. BlockBlob)
|
||||
- `{{ resourcegroup }}` = replaced with the value of the Resource Group
|
||||
- `{{ namespace }}` = replaced with the value of the Namespace (e.g. Microsoft.Compute/virtualMachines)
|
||||
- `{{ resourcename }}` = replaced with the value of the Resource Name
|
||||
- `{{ metric }}` = replaced with metric name (e.g. Percentage CPU)
|
||||
- `{{ dimensionname }}` = *Legacy as of 7.1+ (for backwards compatibility)* replaced with the first dimension's key/label (as sorted by the key/label) (e.g. blobtype)
|
||||
- `{{ dimensionvalue }}` = *Legacy as of 7.1+ (for backwards compatibility)* replaced with first dimension's value (as sorted by the key/label) (e.g. BlockBlob)
|
||||
- `{{ arbitraryDim }}` = *Available in 7.1+* replaced with the value of the corresponding dimension. (e.g. `{{ blobtype }}` becomes BlockBlob)
|
||||
|
||||
### Templating with variables for Azure Monitor
|
||||
### Create template variables for Azure Monitor
|
||||
|
||||
Instead of hard-coding things like server, application and sensor name in your metric queries you can use variables in their place. Variables are shown as dropdown select boxes at the top of the dashboard. These dropdowns make it easy to change the data being displayed in your dashboard.
|
||||
|
||||
@@ -159,29 +167,31 @@ Grafana alerting is supported for the Azure Monitor service. This is not Azure A
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v60/azuremonitor-alerting.png" class="docs-image--no-shadow" caption="Azure Monitor Alerting" >}}
|
||||
|
||||
## Querying the Application Insights Service
|
||||
## Query the Application Insights Service
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v60/appinsights-service-query-editor.png" class="docs-image--no-shadow" caption="Application Insights Query Editor" >}}
|
||||
{{< docs-imagebox img="/img/docs/azuremonitor/insights_metrics_multi-dim.png" class="docs-image--no-shadow" caption="Application Insights Query Editor" >}}
|
||||
|
||||
As of Grafana 7.1, you can select more than one group by dimension.
|
||||
|
||||
### Formatting legend keys with aliases for Application Insights
|
||||
|
||||
The default legend formatting is:
|
||||
|
||||
`metric/name{group/by="groupbyvalue"}`
|
||||
`metricName{dimensionName=dimensionValue,dimensionTwoName=DimensionTwoValue}`
|
||||
|
||||
In the Legend Format field, the aliases which are defined below can be combined any way you want.
|
||||
|
||||
Application Insights Examples:
|
||||
Application Insights examples:
|
||||
|
||||
- `server: {{groupbyvalue}}`
|
||||
- `city: {{groupbyvalue}}`
|
||||
- `{{groupbyname}}: {{groupbyvalue}}`
|
||||
- `city: {{ client/city }}`
|
||||
- `{{ metric }} [Location: {{ client/countryOrRegion }}, {{ client/city }}]`
|
||||
|
||||
### Alias patterns for Application Insights
|
||||
|
||||
- `{{groupbyvalue}}` = replaced with the value of the group by
|
||||
- `{{groupbyname}}` = replaced with the name/label of the group by
|
||||
- `{{metric}}` = replaced with metric name (e.g. requests/count)
|
||||
- `{{ groupbyvalue }}` = *Legacy as of 7.1+ (for backwards compatibility)* replaced with the first dimension's key/label (as sorted by the key/label)
|
||||
- `{{ groupbyname }}` = *Legacy as of 7.1+ (for backwards compatibility)* replaced with first dimension's value (as sorted by the key/label) (e.g. BlockBlob)
|
||||
- `{{ metric }}` = replaced with metric name (e.g. requests/count)
|
||||
- `{{ arbitraryDim }}` = *Available in 7.1+* replaced with the value of the corresponding dimension. (e.g. `{{ client/city }}` becomes Chicago)
|
||||
|
||||
### Filter expressions for Application Insights
|
||||
|
||||
@@ -222,29 +232,64 @@ Grafana alerting is supported for Application Insights. This is not Azure Alerts
|
||||
|
||||
## Querying the Azure Log Analytics service
|
||||
|
||||
Queries are written in the new [Azure Log Analytics (or KustoDB) Query Language](https://docs.loganalytics.io/index). A Log Analytics Query can be formatted as Time Series data or as Table data.
|
||||
Queries are written in the new [Azure Log Analytics (or KustoDB) Query Language](https://docs.microsoft.com/en-us/azure/azure-monitor/log-query/query-language). A Log Analytics query can be formatted as time series data or as table data.
|
||||
|
||||
Time Series queries are for the Graph Panel (and other panels like the Single Stat panel) and must contain a datetime column, a metric name column and a value column. Here is an example query that returns the aggregated count grouped by the Category column and grouped by hour:
|
||||
If your credentials give you access to multiple subscriptions, then choose the appropriate subscription before entering queries.
|
||||
|
||||
```
|
||||
AzureActivity
|
||||
### Time series queries
|
||||
|
||||
Time series queries are for the Graph panel and other panels like the SingleStat panel. Each query must contain at least a datetime column and a numeric value column. The result must also be sorted in ascending order by the datetime column.
|
||||
|
||||
Here is an example query that returns the aggregated count grouped by hour:
|
||||
|
||||
```kusto
|
||||
Perf
|
||||
| where $__timeFilter(TimeGenerated)
|
||||
| summarize count() by Category, bin(TimeGenerated, 1h)
|
||||
| summarize count() by bin(TimeGenerated, 1h)
|
||||
| order by TimeGenerated asc
|
||||
```
|
||||
|
||||
Table queries are mainly used in the Table panel and row a list of columns and rows. This example query returns rows with the 6 specified columns:
|
||||
A query can also have one or more non-numeric/non-datetime columns, and those columns are considered dimensions and become labels in the response. For example, a query that returns the aggregated count grouped by hour, Computer, and the CounterName:
|
||||
|
||||
```kusto
|
||||
Perf
|
||||
| where $__timeFilter(TimeGenerated)
|
||||
| summarize count() by bin(TimeGenerated, 1h), Computer, CounterName
|
||||
| order by TimeGenerated asc
|
||||
```
|
||||
|
||||
You can also select additional number value columns (with, or without multiple dimensions). For example, getting a count and average value by hour, Computer, CounterName, and InstanceName:
|
||||
|
||||
```kusto
|
||||
Perf
|
||||
| where $__timeFilter(TimeGenerated)
|
||||
| summarize Samples=count(), ["Avg Value"]=avg(CounterValue)
|
||||
by bin(TimeGenerated, $__interval), Computer, CounterName, InstanceName
|
||||
| order by TimeGenerated asc
|
||||
```
|
||||
|
||||
> **Tip**: In the above query, the Kusto syntax `Samples=count()` and `["Avg Value"]=...` is used to rename those columns — the second syntax allowing for the space. This changes the name of the metric that Grafana uses, and as a result, things like series legends and table columns will match what you specify. Here `Samples` is displayed instead of `_count`.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/azuremonitor/logs_multi-value_multi-dim.png" class="docs-image--no-shadow" caption="Azure Logs query with multiple values and multiple dimensions" >}}
|
||||
|
||||
### Table queries
|
||||
|
||||
Table queries are mainly used in the Table panel and show a list of columns and rows. This example query returns rows with the six specified columns:
|
||||
|
||||
```kusto
|
||||
AzureActivity
|
||||
| where $__timeFilter()
|
||||
| project TimeGenerated, ResourceGroup, Category, OperationName, ActivityStatus, Caller
|
||||
| order by TimeGenerated desc
|
||||
```
|
||||
|
||||
If your credentials give you access to multiple subscriptions then choose the appropriate subscription first.
|
||||
### Format the display name for Log Analytics
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v60/azureloganalytics-service-query-editor.png" class="docs-image--no-shadow" caption="Azure Log Analytics Query Editor" >}}
|
||||
The default display name format is:
|
||||
|
||||
`metricName{dimensionName=dimensionValue,dimensionTwoName=DimensionTwoValue}`
|
||||
|
||||
This can be customized by using the [display name field configuration option]({{< relref "../../panels/field-configuration-options.md#display-name" >}}).
|
||||
|
||||
### Azure Log Analytics macros
|
||||
|
||||
@@ -304,7 +349,7 @@ Example variable queries:
|
||||
|
||||
Example of a time series query using variables:
|
||||
|
||||
```
|
||||
```kusto
|
||||
Perf
|
||||
| where ObjectName == "$object" and CounterName == "$metric"
|
||||
| where TimeGenerated >= $__timeFrom() and TimeGenerated <= $__timeTo()
|
||||
@@ -331,21 +376,11 @@ If you're not currently logged in to the Azure Portal, then the link opens the l
|
||||
|
||||
Grafana alerting is supported for Application Insights. This is not Azure Alerts support. Read more about how alerting in Grafana works in [Alerting rules]({{< relref "../../alerting/alerts-overview.md" >}}).
|
||||
|
||||
### Writing analytics queries For the Application Insights service
|
||||
## Query the Application Insights Analytics service
|
||||
|
||||
If you change the service type to "Application Insights", the menu icon to the right adds another option, "Toggle Edit Mode". Once clicked, the query edit mode changes to give you a full text area in which to write log analytics queries. (This is identical to how the InfluxDB data source lets you write raw queries.)
|
||||
If you change the service type to **Insights Analytics**, then a similar editor to the Log Analytics service is available. This service also uses the Kusto language, so the instructions for querying data are identical to [querying the log analytics service]({{< relref "#querying-the-azure-log-analytics-service" >}}), except that you query Application Insights Analytics data instead.
|
||||
|
||||
Once a query is written, the column names are automatically parsed out of the response data. You can then select them in the "X-axis", "Y-axis", and "Split On" dropdown menus, or just type them out.
|
||||
|
||||
There are some important caveats to remember:
|
||||
|
||||
- You'll want to order your y-axis in the query, eg. `order by timestamp asc`. The graph may come out looking bizarre otherwise. It's better to have Microsoft sort it on their side where it's faster, than to implement this in the plugin.
|
||||
|
||||
- If you copy a log analytics query, typically they'll end with a render instruction, like `render barchart`. This is unnecessary, but harmless.
|
||||
|
||||
- Currently, four default dashboard variables are supported: `$__timeFilter()`, `$__from`, `$__to`, and `$__interval`. If you're searching in timestamped data, replace the beginning of your where clause to `where $__timeFilter()`. Dashboard changes by time region are handled as you'd expect, as long as you leave the name of the `timestamp` column alone. Likewise, `$__interval` will automatically change based on the dashboard's time region _and_ the width of the chart being displayed. Use it in bins, so `bin(timestamp,$__interval)` changes into something like `bin(timestamp,1s)`. Use `$__from` and `$__to` if you just want the formatted dates to be inserted.
|
||||
|
||||
- Templated dashboard variables are not yet supported! They will come in a future version.
|
||||
{{< docs-imagebox img="/img/docs/azuremonitor/insights_analytics_multi-dim.png" class="docs-image--no-shadow" caption="Azure Application Insights Analytics query with multiple dimensions" >}}
|
||||
|
||||
## Configure the data source with provisioning
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ Grafana ships with built-in support for Google Cloud Monitoring. Just add it as
|
||||
4. Select `Google Cloud Monitoring` from the _Type_ dropdown.
|
||||
5. Upload or paste in the Service Account Key file. See below for steps on how to create a Service Account Key file.
|
||||
|
||||
> NOTE: If you're not seeing the `Data Sources` link in your side menu it means that your current user does not have the `Admin` role for the current organization.
|
||||
> **Note:** If you're not seeing the `Data Sources` link in your side menu, then your current user account does not have the `Admin` role for the current organization.
|
||||
|
||||
| Name | Description |
|
||||
| --------------------- | ------------------------------------------------------------------------------------- |
|
||||
@@ -83,7 +83,7 @@ If Grafana is running on a Google Compute Engine (GCE) virtual machine, it is po
|
||||
|
||||
1. First of all, you need to create a Service Account that can be used by the GCE virtual machine. See detailed instructions on how to do that [here](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#createanewserviceaccount).
|
||||
2. Make sure the GCE virtual machine instance is being run as the service account that you just created. See instructions [here](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#using).
|
||||
3. Allow access to the `Cloud Monitoring Monitoring API` scope.
|
||||
3. Allow access to the `Cloud Monitoring API` scope.
|
||||
|
||||
Read more about creating and enabling service accounts for GCE VM instances [here](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances).
|
||||
|
||||
|
||||
@@ -25,15 +25,16 @@ build dashboards or use Explore with CloudWatch metrics and CloudWatch Logs.
|
||||
> NOTE: If at any moment you have issues with getting this data source to work and Grafana is giving you undescriptive errors then don't
|
||||
> forget to check your log file (try looking in /var/log/grafana/grafana.log).
|
||||
|
||||
| Name | Description |
|
||||
| -------------------------- | ------------------------------------------------------------------------------------------------------- |
|
||||
| _Name_ | The data source name. This is how you refer to the data source in panels and queries. |
|
||||
| _Default_ | Default data source means that it will be pre-selected for new panels. |
|
||||
| _Default Region_ | Used in query editor to set region (can be changed on per query basis) |
|
||||
| _Custom Metrics namespace_ | Specify the CloudWatch namespace of Custom metrics |
|
||||
| _Auth Provider_ | Specify the provider to get credentials. |
|
||||
| _Credentials_ profile name | Specify the name of the profile to use (if you use `~/.aws/credentials` file), leave blank for default. |
|
||||
| _Assume Role Arn_ | Specify the ARN of the role to assume |
|
||||
| Name | Description |
|
||||
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
||||
| _Name_ | The data source name. This is how you refer to the data source in panels and queries. |
|
||||
| _Default_ | Default data source means that it will be pre-selected for new panels. |
|
||||
| _Default Region_ | Used in query editor to set region (can be changed on per query basis) |
|
||||
| _Custom Metrics namespace_ | Specify the CloudWatch namespace of Custom metrics |
|
||||
| _Auth Provider_ | Specify the provider to get credentials. |
|
||||
| _Credentials_ profile name | Specify the name of the profile to use (if you use `~/.aws/credentials` file), leave blank for default. |
|
||||
| _Assume Role Arn_ | Specify the ARN of the role to assume |
|
||||
| _External ID_ | If you are assuming a role in another account, that has been created with an external ID, specify the exterrnal ID here. |
|
||||
|
||||
## Authentication
|
||||
|
||||
@@ -229,8 +230,6 @@ The updated CloudWatch data source ships with pre-configured dashboards for five
|
||||
|
||||
To import the pre-configured dashboards, go to the configuration page of your CloudWatch data source and click on the `Dashboards` tab. Click `Import` for the dashboard you would like to use. To customize the dashboard, we recommend saving the dashboard under a different name, because otherwise the dashboard will be overwritten when a new version of the dashboard is released.
|
||||
|
||||
TODO: will need to be update when we have the dashboards for logs.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v65/cloudwatch-dashboard-import.png" caption="CloudWatch dashboard import" >}}
|
||||
|
||||
## Templated queries
|
||||
@@ -384,6 +383,7 @@ datasources:
|
||||
jsonData:
|
||||
authType: credentials
|
||||
defaultRegion: eu-west-2
|
||||
customMetricsNamespaces: 'CWAgent,CustomNameSpace'
|
||||
```
|
||||
|
||||
### Using `accessKey` and `secretKey`
|
||||
|
||||
@@ -98,7 +98,7 @@ Data links create a link from a specified field that can be accessed in logs vie
|
||||
Each data link configuration consists of:
|
||||
- **Field -** Name of the field used by the data link.
|
||||
- **URL/query -** If the link is external, then enter the full link URL. If the link is internal link, then this input serves as query for the target data source. In both cases, you can interpolate the value from the field with `${__value.raw }` macro.
|
||||
- **Internal link -** Select if the link is internal or external. In case of internal link, a data source selectorallows you to select the target data source. Only tracing data sources are supported.
|
||||
- **Internal link -** Select if the link is internal or external. In case of internal link, a data source selector allows you to select the target data source. Only tracing data sources are supported.
|
||||
|
||||
## Metric Query editor
|
||||
|
||||
|
||||
@@ -17,92 +17,125 @@ Grafana has an advanced Graphite query editor that lets you quickly navigate the
|
||||
change function parameters and much more. The editor can handle all types of graphite queries. It can even handle complex nested
|
||||
queries through the use of query references.
|
||||
|
||||
## Adding the data source
|
||||
Refer to [Add a data source]({{< relref "add-a-data-source.md" >}}) for instructions on how to add a data source to Grafana. Only organization admins can add data sources.
|
||||
|
||||
1. Open the side menu by clicking the Grafana icon in the top header.
|
||||
2. In the side menu under the `Configuration` link you should find a link named `Data Sources`.
|
||||
3. Click the `+ Add data source` button in the top header.
|
||||
4. Select `Graphite` from the *Type* dropdown.
|
||||
## Graphite settings
|
||||
|
||||
> NOTE: If you're not seeing the `Data Sources` link in your side menu it means that your current user does not have the `Admin` role for the current organization.
|
||||
To access Graphite settings, hover your mouse over the **Configuration** (gear) icon, then click **Data Sources**, and then click the Graphite data source.
|
||||
|
||||
Name | Description
|
||||
------------ | -------------
|
||||
*Name* | The data source name. This is how you refer to the data source in panels and queries.
|
||||
*Default* | Default data source means that it will be pre-selected for new panels.
|
||||
*Url* | The HTTP protocol, IP, and port of your graphite-web or graphite-api install.
|
||||
*Access* | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser.
|
||||
Name | The data source name. This is how you refer to the data source in panels and queries.
|
||||
Default | Default data source means that it will be pre-selected for new panels.
|
||||
URL | The HTTP protocol, IP, and port of your graphite-web or graphite-api install.
|
||||
Access | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser.
|
||||
Auth | Refer to [Authentication]({{< relref "../../auth/_index.md" >}}) for more information.
|
||||
Basic Auth | Enable basic authentication to the data source.
|
||||
User | User name for basic authentication.
|
||||
Password | Password for basic authentication.
|
||||
Custom HTTP Headers | Click **Add header** to add a custom HTTP header.
|
||||
Header | Enter the custom header name.
|
||||
Value | Enter the custom header value.
|
||||
Graphite details |
|
||||
Version | Select your version of Graphite.
|
||||
Type | Select your type of Graphite.
|
||||
|
||||
Access mode controls how requests to the data source will be handled. Server should be the preferred way if nothing else stated.
|
||||
Access mode controls how requests to the data source will be handled. Server should be the preferred way if nothing else is stated.
|
||||
|
||||
### Server access mode (Default)
|
||||
### Server access mode (default)
|
||||
|
||||
All requests will be made from the browser to Grafana backend/server which in turn will forward the requests to the data source and by that circumvent possible Cross-Origin Resource Sharing (CORS) requirements. The URL needs to be accessible from the grafana backend/server if you select this access mode.
|
||||
All requests will be made from the browser to Grafana backend/server which in turn will forward the requests to the data source and by that circumvent possible Cross-Origin Resource Sharing (CORS) requirements. The URL needs to be accessible from the Grafana backend/server if you select this access mode.
|
||||
|
||||
### Browser access mode
|
||||
|
||||
All requests will be made from the browser directly to the data source and may be subject to Cross-Origin Resource Sharing (CORS) requirements. The URL needs to be accessible from the browser if you select this access mode.
|
||||
|
||||
## Metric editor
|
||||
## Graphite query editor
|
||||
|
||||
### Navigate metric segments
|
||||
Grafana includes a Graphite-specific query editor to help you build your queries.
|
||||
|
||||
Click the ``Select metric`` link to start navigating the metric space. Once you start you can continue using the mouse
|
||||
or keyboard arrow keys. You can select a wildcard and still continue.
|
||||
To see the raw text of the query that is sent to Graphite, click the **Toggle text edit mode** (pencil) icon.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v45/graphite_query1_still.png"
|
||||
animated-gif="/img/docs/v45/graphite_query1.gif" >}}
|
||||
### Choose metrics to query
|
||||
|
||||
Click **Select metric** to start navigating the metric space. Once you start, you can continue using the mouse or keyboard arrow keys. You can select a wildcard and still continue.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/graphite/graphite-query-editor-still.png"
|
||||
animated-gif="/img/docs/graphite/graphite-query-editor.gif" >}}
|
||||
|
||||
### Functions
|
||||
|
||||
Click the plus icon to the right to add a function. You can search for the function or select it from the menu. Once
|
||||
a function is selected it will be added and your focus will be in the text box of the first parameter. To later change
|
||||
a parameter just click on it and it will turn into a text box. To delete a function click the function name followed
|
||||
by the x icon.
|
||||
Click the plus icon next to **Function** to add a function. You can search for the function or select it from the menu. Once
|
||||
a function is selected, it will be added and your focus will be in the text box of the first parameter.
|
||||
- To edit or change a parameter, click on it and it will turn into a text box.
|
||||
- To delete a function, click the function name followed by the x icon.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v45/graphite_query2_still.png"
|
||||
animated-gif="/img/docs/v45/graphite_query2.gif" >}}
|
||||
{{< docs-imagebox img="/img/docs/graphite/graphite-functions-still.png"
|
||||
animated-gif="/img/docs/graphite/graphite-functions-demo.gif" >}}
|
||||
|
||||
### Optional parameters
|
||||
Some functions like aliasByNode support an optional second argument. To add an argument, hover your mouse over the first argument and then click the `+` symbol that appears. To remove the second optional parameter, click on it and leave it blank and the editor will remove it.
|
||||
|
||||
Some functions like aliasByNode support an optional second argument. To add this parameter specify for example 3,-2 as the first parameter and the function editor will adapt and move the -2 to a second parameter. To remove the second optional parameter just click on it and leave it blank and the editor will remove it.
|
||||
### Sort labels
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v45/graphite_query3_still.png"
|
||||
animated-gif="/img/docs/v45/graphite_query3.gif" >}}
|
||||
If you want consistent ordering, use sortByName. This can be particularly annoying when you have the same labels on multiple graphs, and they are both sorted differently and using different colors. To fix this, use `sortByName()`.
|
||||
|
||||
### Nested Queries
|
||||
### Nested queries
|
||||
|
||||
You can reference queries by the row “letter” that they’re on (similar to Microsoft Excel). If you add a second query to a graph, you can reference the first query simply by typing in #A. This provides an easy and convenient way to build compounded queries.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v45/graphite_nested_queries_still.png"
|
||||
animated-gif="/img/docs/v45/graphite_nested_queries.gif" >}}
|
||||
### Avoiding many queries by using wildcards
|
||||
|
||||
Occasionally one would like to see multiple time series plotted on the same graph. For example we might want to see how the CPU is being utilized on a machine. You might
|
||||
initially create the graph by adding a query for each time series, such as `cpu.percent.user.g`,
|
||||
`cpu.percent.system.g`, and so on. This results in *n* queries made to the data source, which is inefficient.
|
||||
|
||||
To be more efficient one can use wildcards in your search, returning all the time series in one query. For example, `cpu.percent.*.g`.
|
||||
|
||||
### Modify the metric name in my tables or charts
|
||||
|
||||
Use `alias` functions to change metric names on Grafana tables or graphs For example `aliasByNode()` or `aliasSub()`.
|
||||
|
||||
## Point consolidation
|
||||
|
||||
All Graphite metrics are consolidated so that Graphite doesn't return more data points than there are pixels in the graph. By default,
|
||||
this consolidation is done using `avg` function. You can control how Graphite consolidates metrics by adding the Graphite consolidateBy function.
|
||||
|
||||
> *Notice* This means that legend summary values (max, min, total) cannot be all correct at the same time. They are calculated
|
||||
> client side by Grafana. And depending on your consolidation function only one or two can be correct at the same time.
|
||||
> **Note:** This means that legend summary values (max, min, total) cannot all be correct at the same time. They are calculated
|
||||
> client-side by Grafana. And depending on your consolidation function, only one or two can be correct at the same time.
|
||||
|
||||
## Templating
|
||||
## Combine time series
|
||||
|
||||
Instead of hard-coding things like server, application and sensor name in your metric queries you can use variables in their place.
|
||||
Variables are shown as dropdown select boxes at the top of the dashboard. These dropdowns make it easy to change the data
|
||||
To combine time series, click **Combine** in the **Functions** list.
|
||||
|
||||
## Data exploration and tags
|
||||
|
||||
In Graphite, _everything_ is a tag.
|
||||
|
||||
When exploring data, previously-selected tags are used to filter the remaining result set. To select data, you use the
|
||||
`seriesByTag` function, which takes tag expressions (`=`, `!=`, `=~`, `!=~`) to filter timeseries.
|
||||
|
||||
The Grafana query builder does this for you automatically when you select a tag.
|
||||
|
||||
> **Tip:** The regular expression search can be quite slow on high-cardinality tags, so try to use other tags to reduce the scope first.
|
||||
Starting off with a particular name/namespace can help reduce the results.
|
||||
|
||||
## Template variables
|
||||
|
||||
Instead of hard-coding things like server, application, and sensor name in your metric queries, you can use variables in their place.
|
||||
Variables are shown as drop-down select boxes at the top of the dashboard. These dropdowns make it easy to change the data
|
||||
being displayed in your dashboard.
|
||||
|
||||
Check out the [Templating]({{< relref "../../variables/templates-and-variables.md" >}}) documentation for an introduction to the templating feature and the different
|
||||
types of template variables.
|
||||
For more information, refer to [Variables and templates]({{< relref "../../variables/templates-and-variables.md" >}}).
|
||||
|
||||
Graphite 1.1 introduced tags and Grafana added support for Graphite queries with tags in version 5.0. To create a variable using tag values, then you need to use the Grafana functions `tags` and `tag_values`.
|
||||
Graphite 1.1 introduced tags and Grafana added support for Graphite queries with tags in version 5.0. To create a variable using tag values, use the Grafana functions `tags` and `tag_values`.
|
||||
|
||||
Query | Description
|
||||
------------ | -------------
|
||||
*tags()* | Returns all tags.
|
||||
*tags(server=~backend\*)* | Returns only tags that occur in series matching the filter expression.
|
||||
*tag_values(server)* | Return tag values for the specified tag.
|
||||
*tag_values(server, server=~backend\*)* | Returns filtered tag values that occur for the specified tag in series matching those expressions.
|
||||
*tag_values(server, server=~backend\*, app=~${apps:regex})* | Multiple filter expressions and expressions can contain other variables.
|
||||
tags() | Returns all tags.
|
||||
tags(server=~backend\*) | Returns only tags that occur in series matching the filter expression.
|
||||
tag_values(server) | Return tag values for the specified tag.
|
||||
tag_values(server, server=~backend\*) | Returns filtered tag values that occur for the specified tag in series matching those expressions.
|
||||
tag_values(server, server=~backend\*, app=~${apps:regex}) | Multiple filter expressions and expressions can contain other variables.
|
||||
|
||||
For more details, see the [Graphite docs on the autocomplete API for tags](http://graphite.readthedocs.io/en/latest/tags.html#auto-complete-support).
|
||||
|
||||
@@ -114,7 +147,7 @@ variable with all possible values that exist in the wildcard position.
|
||||
You can also create nested variables that use other variables in their definition. For example
|
||||
`apps.$app.servers.*` uses the variable `$app` in its query definition.
|
||||
|
||||
#### Using `__searchFilter` to filter results in Query Variable
|
||||
#### Using `__searchFilter` to filter query variable results
|
||||
> Available from Grafana 6.5 and above
|
||||
|
||||
Using `__searchFilter` in the query field will filter the query result based on what the user types in the dropdown select box.
|
||||
@@ -132,7 +165,7 @@ TagValues
|
||||
tag_values(server, server=~${__searchFilter:regex})
|
||||
```
|
||||
|
||||
### Variable Usage
|
||||
### Variable usage
|
||||
|
||||
You can use a variable in a metric node path or as a parameter to a function.
|
||||

|
||||
@@ -140,15 +173,15 @@ You can use a variable in a metric node path or as a parameter to a function.
|
||||
There are two syntaxes:
|
||||
|
||||
- `$<varname>` Example: apps.frontend.$server.requests.count
|
||||
- `[[varname]]` Example: apps.frontend.[[server]].requests.count
|
||||
- `${varname}` Example: apps.frontend.${server}.requests.count
|
||||
|
||||
Why two ways? The first syntax is easier to read and write but does not allow you to use a variable in the middle of a word. Use
|
||||
the second syntax in expressions like `my.server[[serverNumber]].count`.
|
||||
the second syntax in expressions like `my.server${serverNumber}.count`.
|
||||
|
||||
Example:
|
||||
[Graphite Templated Dashboard](https://play.grafana.org/dashboard/db/graphite-templated-nested)
|
||||
|
||||
### Variable Usage in Tag Queries
|
||||
### Variable usage in tag queries
|
||||
|
||||
Multi-value variables in tag queries use the advanced formatting syntax introduced in Grafana 5.0 for variables: `{var:regex}`. Non-tag queries will use the default glob formatting for multi-value variables.
|
||||
|
||||
@@ -158,7 +191,7 @@ Example of a tag expression with regex formatting and using the Equal Tilde oper
|
||||
server=~${servers:regex}
|
||||
```
|
||||
|
||||
Check out the [Advanced Formatting Options section in the Variables]({{< relref "../../variables/templates-and-variables.md#advanced-formatting-options" >}}) documentation for examples and details.
|
||||
For more information, refer to [Advanced variable format options]({{< relref "../../variables/advanced-variable-format-options.md" >}}).
|
||||
|
||||
## Annotations
|
||||
|
||||
@@ -168,7 +201,7 @@ queries via the Dashboard menu / Annotations view.
|
||||
Graphite supports two ways to query annotations. A regular metric query, for this you use the `Graphite query` textbox. A Graphite events query, use the `Graphite event tags` textbox,
|
||||
specify a tag or wildcard (leave empty should also work)
|
||||
|
||||
## Getting Grafana metrics into Graphite
|
||||
## Get Grafana metrics into Graphite
|
||||
|
||||
Grafana exposes metrics for Graphite on the `/metrics` endpoint. For detailed instructions, refer to [Internal Grafana metrics]({{< relref "../../administration/metrics.md">}}).
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
+++
|
||||
title = "Using InfluxDB in Grafana"
|
||||
description = "Guide for using InfluxDB in Grafana"
|
||||
keywords = ["grafana", "influxdb", "guide"]
|
||||
keywords = ["grafana", "influxdb", "guide", "flux"]
|
||||
type = "docs"
|
||||
aliases = ["/docs/grafana/latest/datasources/influxdb"]
|
||||
[menu.docs]
|
||||
@@ -20,14 +20,18 @@ Grafana ships with a feature-rich data source plugin for InfluxDB. The plugin in
|
||||
2. In the side menu under the `Dashboards` link you should find a link named `Data Sources`.
|
||||
3. Click the `+ Add data source` button in the top header.
|
||||
4. Select *InfluxDB* from the *Type* dropdown.
|
||||
5. Select *InfluxQL* or *Flux* from the `Query Language` list.
|
||||
|
||||
> NOTE: If you're not seeing the `Data Sources` link in your side menu it means that your current user does not have the `Admin` role for the current organization.
|
||||
> **Note:** If you're not seeing the `Data Sources` link in your side menu it means that your current user does not have the `Admin` role for the current organization.
|
||||
|
||||
|
||||
### InfluxQL (classic InfluxDB query)
|
||||
|
||||
Name | Description
|
||||
------------ | -------------
|
||||
*Name* | The data source name. This is how you refer to the data source in panels and queries.
|
||||
*Default* | Default data source means that it will be pre-selected for new panels.
|
||||
*Url* | The HTTP protocol, IP address and port of your InfluxDB API (InfluxDB API port is by default 8086)
|
||||
*URL* | The HTTP protocol, IP address and port of your InfluxDB API (InfluxDB API port is by default 8086)
|
||||
*Access* | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser.
|
||||
*Database* | Name of your InfluxDB database
|
||||
*User* | Name of your database user
|
||||
@@ -93,7 +97,7 @@ specify an asterix `*` to select all fields.
|
||||
|
||||
### Group By
|
||||
To group by a tag click the plus icon at the end of the GROUP BY row. Pick a tag from the dropdown that appears.
|
||||
You can remove the group by by clicking on the `tag` and then click on the x icon.
|
||||
You can remove the "Group By" by clicking on the `tag` and then click on the x icon.
|
||||
|
||||
### Text Editor Mode (RAW)
|
||||
You can switch to raw query mode by clicking hamburger icon and then `Switch editor mode`.
|
||||
@@ -117,6 +121,61 @@ You can switch to raw query mode by clicking hamburger icon and then `Switch edi
|
||||
You can remove the group by time by clicking on the `time` part and then the `x` icon. You can
|
||||
change the option `Format As` to `Table` if you want to show raw data in the `Table` panel.
|
||||
|
||||
## Flux support
|
||||
|
||||
> Starting in v7.1, Grafana can execute Flux queries.
|
||||
|
||||
The client supports Flux running on InfluxDB 1.8+. See [1.8 compatibility](https://github.com/influxdata/influxdb-client-go/#influxdb-18-api-compatibility) for more information and connection details.
|
||||
|
||||
|
||||
Name | Description
|
||||
------------ | -------------
|
||||
*URL* | The HTTP protocol, IP address and port of your InfluxDB API (InfluxDB 2.0 API port is by default 9999)
|
||||
*Organization* | The [Influx organization](https://v2.docs.influxdata.com/v2.0/organizations/) that will be used for Flux queries. This is also used to for the `v.organization` query macro
|
||||
*Token* | The authentication token used for Flux queries. With Influx 2.0, use the [influx authentication token to function](https://v2.docs.influxdata.com/v2.0/security/tokens/create-token/). For influx 1.8, the token is `username:password`
|
||||
*Default Bucket* | The [Influx bucket](https://v2.docs.influxdata.com/v2.0/organizations/buckets/) that will be used for the `v.defaultBucket` macro in Flux queries
|
||||
|
||||
You can use the [Flux query and scripting language](https://www.influxdata.com/products/flux/). Grafana's Flux query editor is a text editor for raw Flux queries with Macro support.
|
||||
|
||||
|
||||
### Supported macros
|
||||
|
||||
The macros support copying and pasting from [Chronograph](https://www.influxdata.com/time-series-platform/chronograf/).
|
||||
|
||||
Macro example | Description
|
||||
------------ | -------------
|
||||
*`v.timeRangeStart`* | Will be replaced by the start of the currently active time selection. For example, *2020-06-11T13:31:00Z*
|
||||
*`v.timeRangeEnd`* | Will be replaced by the end of the currently active time selection. For example, *2020-06-11T14:31:00Z*
|
||||
*`v.windowPeriod`* | Will be replaced with an interval string compatible with Flux that corresponds to Grafana's calculated interval based on the time range of the active time selection. For example, *5s*
|
||||
*`v.defaultBucket`* | Will be replaced with the data source configuration's "Default Bucket" setting
|
||||
*`v.organization`* | Will be replaced with the data source configuration's "Organization" setting
|
||||
|
||||
For example, the following query will be interpolated as the query that follows it, with interval and time period values changing according to active time selection\):
|
||||
|
||||
Grafana Flux query:
|
||||
|
||||
```flux
|
||||
from(bucket: v.defaultBucket)
|
||||
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|
||||
|> filter(fn: (r) => r["_measurement"] == "cpu" or r["_measurement"] == "swap")
|
||||
|> filter(fn: (r) => r["_field"] == "usage_system" or r["_field"] == "free")
|
||||
|> aggregateWindow(every: v.windowPeriod, fn: mean)
|
||||
|> yield(name: "mean")
|
||||
```
|
||||
|
||||
Interpolated query send to Influx:
|
||||
|
||||
```flux
|
||||
from(bucket: "grafana")
|
||||
|> range(start: 2020-06-11T13:59:07Z, stop: 2020-06-11T14:59:07Z)
|
||||
|> filter(fn: (r) => r["_measurement"] == "cpu" or r["_measurement"] == "swap")
|
||||
|> filter(fn: (r) => r["_field"] == "usage_system" or r["_field"] == "free")
|
||||
|> aggregateWindow(every: 2s, fn: mean)
|
||||
|> yield(name: "mean")
|
||||
```
|
||||
|
||||
You can view the interpolated version of a query with the Query Inspector.
|
||||
|
||||
## Querying Logs (BETA)
|
||||
|
||||
> Only available in Grafana v6.3+.
|
||||
@@ -219,11 +278,12 @@ You can now configure data sources using config files with Grafana's provisionin
|
||||
|
||||
Here are some provisioning examples for this data source.
|
||||
|
||||
### InfluxDB 1.x example
|
||||
```yaml
|
||||
apiVersion: 1
|
||||
|
||||
datasources:
|
||||
- name: InfluxDB
|
||||
- name: InfluxDB_v1
|
||||
type: influxdb
|
||||
access: proxy
|
||||
database: site
|
||||
@@ -233,3 +293,21 @@ datasources:
|
||||
jsonData:
|
||||
httpMode: GET
|
||||
```
|
||||
|
||||
### InfluxDB 2.x example
|
||||
```yaml
|
||||
apiVersion: 1
|
||||
|
||||
datasources:
|
||||
- name: InfluxDB_v2
|
||||
type: influxdb
|
||||
access: proxy
|
||||
url: http://localhost:8086
|
||||
secureJsonData:
|
||||
token: token
|
||||
jsonData:
|
||||
version: Flux
|
||||
organization: organization
|
||||
defaultBucket: bucket
|
||||
tlsSkipVerify: true
|
||||
```
|
||||
|
||||
@@ -38,18 +38,19 @@ Just add it as a data source and you are ready to query your log data in [Explor
|
||||
|
||||
### Derived fields
|
||||
|
||||
The Derived Fields configuration allows you to:
|
||||
The Derived Fields configuration allows you to:
|
||||
|
||||
* Add fields parsed from the log message.
|
||||
* Add a link that uses the value of the field.
|
||||
* Add fields parsed from the log message.
|
||||
* Add a link that uses the value of the field.
|
||||
|
||||
You can use this functionality to link to your tracing backend directly from your logs, or link to a user profile page if a userId is present in the log line. These links appear in the [log details](/features/explore/#labels-and-parsed-fields).
|
||||
{{< docs-imagebox img="/img/docs/v65/loki_derived_fields.png" class="docs-image--no-shadow" caption="Screenshot of the derived fields configuration" >}}
|
||||
Each derived field consists of:
|
||||
|
||||
- **Name:** Shown in the log details as a label.
|
||||
- **Regex:** A Regex pattern that runs on the log message and captures part of it as the value of the new field. Can only contain a single capture group.
|
||||
- **URL**: A URL template used to construct a link next to the field value in log details. Use special `${__value.raw}` value in your template to interpolate the real field value into your URL template.
|
||||
- **Name -** Shown in the log details as a label.
|
||||
- **Regex -** A Regex pattern that runs on the log message and captures part of it as the value of the new field. Can only contain a single capture group.
|
||||
- **URL/query -** If the link is external, then enter the full link URL. If the link is internal link, then this input serves as query for the target data source. In both cases, you can interpolate the value from the field with `${__value.raw }` macro.
|
||||
- **Internal link -** Select if the link is internal or external. In case of internal link, a data source selector allows you to select the target data source. Only tracing data sources are supported.
|
||||
|
||||
You can use a debug section to see what your fields extract and how the URL is interpolated. Click **Show example log message** to show the text area where you can enter a log message.
|
||||
{{< docs-imagebox img="/img/docs/v65/loki_derived_fields_debug.png" class="docs-image--no-shadow" caption="Screenshot of the derived fields debugging" >}}
|
||||
@@ -59,7 +60,7 @@ The new field with the link shown in log details:
|
||||
|
||||
## Querying Logs
|
||||
|
||||
Querying and displaying log data from Loki is available via [Explore]({{< relref "../explore" >}}), and with the [logs panel]({{< relref "../../panels/visualizations/logs-panel.md" >}}) in dashboards. Select the Loki data source, and then enter a log query to display your logs.
|
||||
Querying and displaying log data from Loki is available via [Explore]({{< relref "../explore" >}}), and with the [logs panel]({{< relref "../../panels/visualizations/logs-panel.md" >}}) in dashboards. Select the Loki data source, and then enter a [LogQL](https://grafana.com/docs/loki/latest/logql/) query to display your logs.
|
||||
|
||||
### Log Queries
|
||||
|
||||
@@ -123,7 +124,7 @@ The following filter types are currently supported:
|
||||
* `|~` line matches regular expression.
|
||||
* `!~` line does not match regular expression.
|
||||
|
||||
> Note: For more details about LogQL, Loki's query language, refer to the [documentation](https://github.com/grafana/loki/blob/master/docs/logql.md)
|
||||
> Note: For more details about LogQL, Loki's query language, refer to the [documentation](https://grafana.com/docs/loki/latest/logql/)
|
||||
|
||||
## Live tailing
|
||||
|
||||
@@ -193,6 +194,7 @@ datasources:
|
||||
derivedFields:
|
||||
# Field with internal link pointing to data source in Grafana.
|
||||
# Right now, Grafana supports only Jaeger and Zipkin data sources as link targets.
|
||||
# datasourceUid value can be anything, but it should be unique across all defined data source uids.
|
||||
- datasourceUid: my_jaeger_uid
|
||||
matcherRegex: "traceID=(\\w+)"
|
||||
name: TraceID
|
||||
|
||||
@@ -149,7 +149,7 @@ SELECT
|
||||
1.11, 2.22, 3.33,
|
||||
'char10', 'varchar10', 'text',
|
||||
N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺',
|
||||
GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), SWITCHOFFSET(CAST(GETDATE() AS DATETIMEOFFSET), '-07:00'))
|
||||
GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), SWITCHOFFSET(CAST(GETDATE() AS DATETIMEOFFSET), '-07:00')
|
||||
```
|
||||
|
||||
Query editor with example query:
|
||||
|
||||
@@ -26,7 +26,7 @@ Name | Description
|
||||
------------ | -------------
|
||||
*Name* | The data source name. This is how you refer to the data source in panels and queries.
|
||||
*Default* | Default data source means that it will be pre-selected for new panels.
|
||||
*Host* | The IP address/hostname and optional port of your PostgreSQL instance.
|
||||
*Host* | The IP address/hostname and optional port of your PostgreSQL instance. _Do not_ include the database name. The connection string for connecting to Postgres will not be correct and will cause errors.
|
||||
*Database* | Name of your PostgreSQL database.
|
||||
*User* | Database user's login/username
|
||||
*Password* | Database user's password
|
||||
@@ -55,7 +55,7 @@ Identifier | Description
|
||||
`s` | second
|
||||
`ms` | millisecond
|
||||
|
||||
### Database User Permissions (Important!)
|
||||
### Database user permissions (Important!)
|
||||
|
||||
The database user you specify when you add the data source should only be granted SELECT permissions on
|
||||
the specified database and tables you want to query. Grafana does not validate that the query is safe. The query
|
||||
@@ -72,9 +72,7 @@ Example:
|
||||
|
||||
Make sure the user does not get any unwanted privileges from the public role.
|
||||
|
||||
## Query Editor
|
||||
|
||||
> Only available in Grafana v5.3+.
|
||||
## Query editor
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v53/postgres_query_still.png" class="docs-image--no-shadow" animated-gif="/img/docs/v53/postgres_query.gif" >}}
|
||||
|
||||
@@ -97,7 +95,7 @@ If you want to use a column with a different datatype as metric column you may e
|
||||
You may also enter arbitrary SQL expressions in the metric column field that evaluate to a text datatype like
|
||||
`hostname || ' ' || container_name`.
|
||||
|
||||
### Columns, Window and Aggregation functions (SELECT)
|
||||
### Columns, window, and aggregation functions (SELECT)
|
||||
|
||||
In the `SELECT` row you can specify what columns and functions you want to use.
|
||||
In the column field you may write arbitrary expressions instead of a column name like `column1 * column2 / column3`.
|
||||
@@ -120,17 +118,17 @@ You may add further value columns by clicking the plus button and selecting `Col
|
||||
To add a filter click the plus icon to the right of the `WHERE` condition. You can remove filters by clicking on
|
||||
the filter and selecting `Remove`. A filter for the current selected timerange is automatically added to new queries.
|
||||
|
||||
### Group By
|
||||
### Group by
|
||||
To group by time or any other columns click the plus icon at the end of the GROUP BY row. The suggestion dropdown will only show text columns of your currently selected table but you may manually enter any column.
|
||||
You can remove the group by clicking on the item and then selecting `Remove`.
|
||||
|
||||
If you add any grouping, all selected columns need to have an aggregate function applied. The query builder will automatically add aggregate functions to all columns without aggregate functions when you add groupings.
|
||||
|
||||
#### Gap Filling
|
||||
#### Gap filling
|
||||
|
||||
Grafana can fill in missing values when you group by time. The time function accepts two arguments. The first argument is the time window that you would like to group by, and the second argument is the value you want Grafana to fill missing items with.
|
||||
|
||||
### Text Editor Mode (RAW)
|
||||
### Text editor mode (RAW)
|
||||
You can switch to the raw query editor mode by clicking the hamburger icon and selecting `Switch editor mode` or by clicking `Edit SQL` below the query.
|
||||
|
||||
> If you use the raw query editor, be sure your query at minimum has `ORDER BY time` and a filter on the returned time range.
|
||||
@@ -242,9 +240,9 @@ ORDER BY time
|
||||
|
||||
Instead of hard-coding things like server, application and sensor name in your metric queries you can use variables in their place. Variables are shown as dropdown select boxes at the top of the dashboard. These dropdowns make it easy to change the data being displayed in your dashboard.
|
||||
|
||||
Check out the [Templating]({{< relref "../../variables/templates-and-variables.md" >}}) documentation for an introduction to the templating feature and the different types of template variables.
|
||||
Refer to [Templates and variables]({{< relref "../../variables/templates-and-variables.md" >}}) for an introduction to the templating feature and the different types of template variables.
|
||||
|
||||
### Query Variable
|
||||
### Query variable
|
||||
|
||||
If you add a template variable of the type `Query`, you can write a PostgreSQL query that can
|
||||
return things like measurement names, key names or key values that are shown as a dropdown select box.
|
||||
@@ -327,7 +325,7 @@ WHERE $__timeFilter(atimestamp) and hostname in([[hostname]])
|
||||
ORDER BY atimestamp ASC
|
||||
```
|
||||
|
||||
#### Disabling Quoting for Multi-value Variables
|
||||
#### Disabling quoting for multi-value variables
|
||||
|
||||
Grafana automatically creates a quoted, comma-separated string for multi-value variables. For example: if `server01` and `server02` are selected then it will be formatted as: `'server01', 'server02'`. To disable quoting, use the csv formatting option for variables:
|
||||
|
||||
@@ -418,3 +416,7 @@ datasources:
|
||||
postgresVersion: 903 # 903=9.3, 904=9.4, 905=9.5, 906=9.6, 1000=10
|
||||
timescaledb: false
|
||||
```
|
||||
|
||||
If you encounter metric request errors or other issues:
|
||||
- Make sure your data source YAML file parameters exactly match the example. This includes parameter names and use of quotation marks.
|
||||
- Make sure the `database` name is not included in the `url`.
|
||||
|
||||
@@ -12,11 +12,11 @@ weight = 1
|
||||
|
||||
# Prometheus data source
|
||||
|
||||
Grafana includes built-in support for Prometheus. This topic explains options, variables, querying, and other options specific to the Prometheus data source. Refer to [Add a data source]({{< relref "add-a-data-source.md" >}}) for instructions on how to add a data source to Grafana.
|
||||
Grafana includes built-in support for Prometheus. This topic explains options, variables, querying, and other options specific to the Prometheus data source. Refer to [Add a data source]({{< relref "add-a-data-source.md" >}}) for instructions on how to add a data source to Grafana. Only users with the organization admin role can add data sources.
|
||||
|
||||
## Prometheus settings
|
||||
|
||||
To access Prometheus settings, click the **Configuration** (gear) icon, then click **Data Sources**, and then click **Prometheus**.
|
||||
To access Prometheus settings, hover your mouse over the **Configuration** (gear) icon, then click **Data Sources**, and then click the Prometheus data source.
|
||||
|
||||
| Name | Description |
|
||||
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
@@ -28,6 +28,7 @@ To access Prometheus settings, click the **Configuration** (gear) icon, then cli
|
||||
| _User_ | User name for basic authentication. |
|
||||
| _Password_ | Password for basic authentication. |
|
||||
| _Scrape interval_ | Set this to the typical scrape and evaluation interval configured in Prometheus. Defaults to 15s. |
|
||||
| _Disable metrics lookup_ | Checking this option will disable the metrics chooser and metric/label support in the query field's autocomplete. This helps if you have performance issues with bigger Prometheus instances. |
|
||||
| _Custom Query Parameters_ | Add custom parameters to the Prometheus query URL. For example `timeout`, `partial_response`, `dedup`, or `max_source_resolution`. Multiple parameters should be concatenated together with an '&'. |
|
||||
|
||||
## Prometheus query editor
|
||||
@@ -41,7 +42,7 @@ Open a graph in edit mode by clicking the title > Edit (or by pressing `e` key w
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| _Query expression_ | Prometheus query expression, check out the [Prometheus documentation](http://prometheus.io/docs/querying/basics/). |
|
||||
| _Legend format_ | Controls the name of the time series, using name or pattern. For example `{{hostname}}` is replaced with the label value for the label `hostname`. |
|
||||
| _Min step_ | An additional lower limit for the [`step` parameter of Prometheus range queries](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries) and for the `$__interval` variable. The limit is absolute and not modified by the _Resolution_ setting. |
|
||||
| _Min step_ | An additional lower limit for the [`step` parameter of Prometheus range queries](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries) and for the `$__interval` and `$__rate_interval` variables. The limit is absolute and not modified by the _Resolution_ setting. |
|
||||
| _Resolution_ | `1/1` sets both the `$__interval` variable and the [`step` parameter of Prometheus range queries](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries) such that each pixel corresponds to one data point. For better performance, lower resolutions can be picked. `1/2` only retrieves a data point for every other pixel, and `1/10` retrieves one data point per 10 pixels. Note that both _Min time interval_ and _Min step_ limit the final value of `$__interval` and `step`. |
|
||||
| _Metric lookup_ | Search for metric names in this input field. |
|
||||
| _Format as_ | Switch between `Table`, `Time series` or `Heatmap`. `Table` will only work in the Table panel. `Heatmap` is suitable for displaying metrics of the Histogram type on a Heatmap panel. Under the hood, it converts cumulative histograms to regular ones and sorts series by the bucket bound. |
|
||||
@@ -89,7 +90,7 @@ For details of what _metric names_, _label names_ and _label values_ are please
|
||||
|
||||
> Support for `$__range`, `$__range_s` and `$__range_ms` only available from Grafana v5.3
|
||||
|
||||
You can use some global built-in variables in query variables; `$__interval`, `$__interval_ms`, `$__range`, `$__range_s` and `$__range_ms`, see [Global built-in variables]({{< relref "../../variables/global-variables.md" >}}) for more information. These can be convenient to use in conjunction with the `query_result` function when you need to filter variable queries since
|
||||
You can use some global built-in variables in query variables; `$__interval`, `$__interval_ms`, `$__range`, `$__range_s` and `$__range_ms`, see [Global built-in variables]({{< relref "../../variables/variable-types/global-variables.md" >}}) for more information. These can be convenient to use in conjunction with the `query_result` function when you need to filter variable queries since
|
||||
|
||||
`label_values` function doesn't support queries.
|
||||
|
||||
@@ -110,6 +111,11 @@ Populate a variable with the instances having a certain state over the time rang
|
||||
Query: query_result(max_over_time(<metric>[${__range_s}s]) != <state>)
|
||||
Regex:
|
||||
```
|
||||
### Using `$__rate_interval` variable
|
||||
|
||||
> **Note:** Available in Grafana 7.2 and above
|
||||
|
||||
The `$__rate_interval` variable is meant to be used in the rate function. It is defined as max( `$__interval` + _Scrape interval_, 4 * _Scrape interval_), where _Scrape interval_ is the Min step setting (AKA query_interval, a setting per PromQL query), if any is set, and otherwise the _Scrape interval_ as set in the Prometheus data source (but ignoring any Min interval setting in the panel, because the latter is modified by the resolution setting).
|
||||
|
||||
### Using variables in queries
|
||||
|
||||
|
||||
@@ -49,4 +49,4 @@ Zipkin annotations are shown in the trace view as logs with annotation value sho
|
||||
|
||||
## Linking Trace ID from logs
|
||||
|
||||
You can link to Zipkin trace from logs in Loki by configuring a derived field with internal link. See [Loki documentation]([Explore]({{< relref "./loki#derived-fields" >}})) for details.
|
||||
You can link to Zipkin trace from logs in Loki by configuring a derived field with internal link. See [Loki documentation]({{< relref "./loki#derived-fields" >}}) for details.
|
||||
|
||||
@@ -31,11 +31,11 @@ There is an Explore icon on the menu bar to the left. This opens an empty Explor
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v65/explore_menu.png" class="docs-image--no-shadow" caption="Screenshot of the new Explore Icon" >}}
|
||||
|
||||
If you want to start with an existing query in a panel then choose the Explore option from the Panel menu. This opens an Explore tab with the query from the panel and allows you to tweak or iterate in the query outside of your dashboard.
|
||||
If you want to start with an existing query in a panel, choose the Explore option from the Panel menu. This opens an Explore tab with the query from the panel and allows you to tweak or iterate in the query outside of your dashboard.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v65/explore_panel_menu.png" class="docs-image--no-shadow" caption="Screenshot of the new Explore option in the panel menu" >}}
|
||||
|
||||
Choose your data source from the dropdown in the top left. Prometheus has a custom Explore implementation, the other data sources (for now) use their standard query editor.
|
||||
Choose your data source from the dropdown in the top left. Prometheus has a custom Explore implementation, the other data sources use their standard query editor.
|
||||
|
||||
The query field is where you can write your query and explore your data. There are three buttons beside the query field, a clear button (X), an add query button (+) and the remove query button (-). Just like the normal query editor, you can add and remove multiple queries.
|
||||
|
||||
@@ -84,7 +84,7 @@ By default, query history shows you the most recent queries. You can sort your h
|
||||
|
||||
Filter query history in Query history and Starred tab by data source name:
|
||||
|
||||
1. Click the **Filter queries for specific data source(s)** field
|
||||
1. Click the **Filter queries for specific data source(s)** field.
|
||||
2. Select the data source for which you would like to filter your history. You can select multiple data sources.
|
||||
|
||||
In **Query history** tab it is also possible to filter queries by date using the slider:
|
||||
@@ -95,6 +95,13 @@ In **Query history** tab it is also possible to filter queries by date using the
|
||||
|
||||
> Note: If you are in split mode, filters are applied only to your currently active panel.
|
||||
|
||||
### Search in query history
|
||||
|
||||
You can search in your history across queries and your comments. Search is possible for queries in the Query history tab and Starred tab.
|
||||
|
||||
1. Click the **Search queries** field.
|
||||
1. Type the term you are searching for into search field.
|
||||
|
||||
### Query history settings
|
||||
|
||||
You can customize the query history in the Settings tab. Options are described in the table below.
|
||||
@@ -103,7 +110,7 @@ You can customize the query history in the Settings tab. Options are described i
|
||||
| ------------------------------------------------------------- | --------------------------------------- |
|
||||
| Period of time for which Grafana will save your query history | 1 week |
|
||||
| Change the default active tab | Query history tab |
|
||||
| Only show queries for datasource currently active in Explore | False |
|
||||
| Only show queries for data source currently active in Explore | True |
|
||||
| Clear query history | Permanently deletes all stored queries. |
|
||||
|
||||
> Note: Query history settings are global, and applied to both panels in split mode.
|
||||
@@ -146,14 +153,6 @@ Along with metrics, Explore allows you to investigate your logs with the followi
|
||||
|
||||
You can customize how logs are displayed and select which columns are shown.
|
||||
|
||||
#### Deduping
|
||||
|
||||
Log data can be very repetitive and Explore can help by hiding duplicate log lines. There are a few different deduplication algorithms that you can use:
|
||||
|
||||
- `exact` Exact matches are done on the whole line, except for date fields.
|
||||
- `numbers` Matches on the line after stripping out numbers (durations, IP addresses etc.).
|
||||
- `signature` The most aggressive deduping - strips all letters and numbers, and matches on the remaining whitespace and punctuation.
|
||||
|
||||
#### Time
|
||||
|
||||
Shows or hides the time column. This is the timestamp associated with the log line as reported from the data source.
|
||||
@@ -166,6 +165,18 @@ Shows or hides the unique labels column that includes only non-common labels. Al
|
||||
|
||||
Set this to True if you want the display to use line wrapping. If set to False, it will result in horizontal scrolling.
|
||||
|
||||
#### Deduping
|
||||
|
||||
Log data can be very repetitive and Explore can help by hiding duplicate log lines. There are a few different deduplication algorithms that you can use:
|
||||
|
||||
- **Exact -** Exact matches are done on the whole line except for date fields.
|
||||
- **Numbers -** Matches on the line after stripping out numbers such as durations, IP addresses, and so on.
|
||||
- **Signature -** The most aggressive deduping, this strips all letters and numbers and matches on the remaining whitespace and punctuation.
|
||||
|
||||
#### Flip results order
|
||||
|
||||
You can change the order of received logs from the default descending order (newest first) to ascending order (oldest first).
|
||||
|
||||
### Labels and parsed fields
|
||||
|
||||
Each log row has an extendable area with its labels and parsed fields, for more robust interaction. For all labels we have added the ability to filter for (positive filter) and filter out (negative filter) selected labels. Each field or label also has a stats icon to display ad-hoc statistics in relation to all displayed logs.
|
||||
@@ -199,6 +210,7 @@ While in Live tail view new logs will come from the bottom of the screen and wil
|
||||
{{< docs-imagebox img="/img/docs/v64/explore_live_tailing.gif" class="docs-image--no-shadow" caption="Explore Live tailing in action" >}}
|
||||
|
||||
## Tracing integration
|
||||
|
||||
> Only available in Grafana v7.0+.
|
||||
|
||||
You can visualize traces from tracing data sources in explore. Data sources currently supported:
|
||||
@@ -229,12 +241,13 @@ Shows condensed view or the trace timeline. Drag your mouse over the minimap to
|
||||
{{< docs-imagebox img="/img/docs/v70/explore-trace-view-timeline.png" class="docs-image--no-shadow" caption="Screenshot of the trace view timeline" >}}
|
||||
|
||||
Shows list of spans within the trace. Each span row consists of these components:
|
||||
|
||||
- Expand children button: Expands or collapses all the children spans of selected span.
|
||||
- Service name: Name of the service logged the span.
|
||||
- Operation name: Name of the operation that this span represents.
|
||||
- Span duration bar: Visual representation of the operation duration within the trace.
|
||||
|
||||
Clicking anywhere on the span row will show span details.
|
||||
Clicking anywhere on the span row shows span details.
|
||||
|
||||
##### Span details
|
||||
|
||||
@@ -261,3 +274,11 @@ Simply clicking the button will return you to the origin dashboard, or, if you'd
|
||||
the arrow next to the button to reveal a "Return to panel with changes" menu item.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v64/explore_return_dropdown.png" class="docs-image--no-shadow" caption="Screenshot of the expanded explore return dropdown" >}}
|
||||
|
||||
## Query inspector
|
||||
|
||||
To help with debugging queries, Explore allows you to investigate query requests and responses, as well as query statistics, via the Query inspector.
|
||||
This functionality is similar to the panel inspector [Stats tab]({{< relref "../../panels/inspect-panel.md#inspect-query-performance" >}}) and
|
||||
[Query tab]({{< relref "../../panels/inspect-panel.md##view-raw-request-and-response-to-data-source" >}}).
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v71/query_inspector_explore.png" class="docs-image--no-shadow" caption="Screenshot of the query inspector button in Explore" >}}
|
||||
|
||||
@@ -9,4 +9,4 @@ weight = 100
|
||||
|
||||
# Getting started
|
||||
|
||||
These guides will help you get started and acquainted with Grafana. To learn more about Grafana in general, refer to [What is Grafana?]({{< relref "what-is-grafana.md" >}}).
|
||||
These guides will help beginners get started and acquainted with Grafana. To learn more about Grafana in general, refer to [What is Grafana?]({{< relref "what-is-grafana.md" >}}).
|
||||
|
||||
90
docs/sources/getting-started/timeseries-dimensions.md
Normal file
90
docs/sources/getting-started/timeseries-dimensions.md
Normal file
@@ -0,0 +1,90 @@
|
||||
+++
|
||||
title = "Time series dimensions"
|
||||
description = "time series dimensions"
|
||||
keywords = ["grafana", "intro", "guide", "concepts", "timeseries", "labels"]
|
||||
type = "docs"
|
||||
aliases = ["/docs/grafana/latest/guides/timeseries-dimensions"]
|
||||
[menu.docs]
|
||||
name = "Time series dimensions"
|
||||
identifier = "time_series_dimensions"
|
||||
parent = "guides"
|
||||
weight = 300
|
||||
+++
|
||||
|
||||
# Time series dimensions
|
||||
|
||||
At the end of the ["Time series databases" section of "Introduction to time series"]({{< relref "timeseries.md#time-series-databases" >}}), the concept of _labels_, also called _tags_, is introduced:
|
||||
|
||||
> Another feature of a TSDB is the ability to filter measurements using _tags_. Each data point is labeled with a tag that adds context information, such as where the measurement was taken. ...
|
||||
|
||||
With time series data, the data often contain more than a single series, and is a set of multiple time series. Many Grafana data sources support this type of data.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/example_graph_multi_dim.png" class="docs-image--no-shadow" max-width="850px" >}}
|
||||
|
||||
The common case is issuing a single query for a measurement with one or more additional properties as dimensions. For example, querying a temperature measurement along with a location property. In this case, multiple series are returned back from that single query and each series has unique location as a dimension.
|
||||
|
||||
To identify unique series within a set of time series, Grafana stores dimensions in _labels_.
|
||||
|
||||
## Labels
|
||||
|
||||
Each time series in Grafana optionally has labels. labels are set a of key/value pairs for identifying dimensions. Example labels could are `{location=us}` or `{country=us,state=ma,city=boston}`. Within a set of time series, the combination of its name and labels identifies each series. For example, `temperature {country=us,state=ma,city=boston}`.
|
||||
|
||||
Different sources of time series data have dimensions stored natively, or common storage patterns that allow the data to be extracted into dimensions.
|
||||
|
||||
Time series databases (TSDBs) usually natively support dimensionality. Prometheus also stores dimensions in _labels_. In TSDBs such as Graphite or OpenTSDB the term _tags_ is used instead.
|
||||
|
||||
In table databases such SQL, these dimensions are generally the `GROUP BY` parameters of a query.
|
||||
|
||||
## Multiple dimensions in table format
|
||||
|
||||
In SQL or SQL-like databases that return table responses, additional dimensions usually columns in the query response table.
|
||||
|
||||
### Single dimension
|
||||
|
||||
For example, consider a query like:
|
||||
|
||||
```sql
|
||||
SELECT BUCKET(StartTime, 1h), AVG(Temperature) AS Temp, Location FROM T
|
||||
GROUP BY BUCKET(StartTime, 1h), Location
|
||||
ORDER BY time asc
|
||||
```
|
||||
|
||||
Might return a table with three columns that each respectively have data types time, number, and string.
|
||||
|
||||
| StartTime | Temp | Location |
|
||||
| ---------- | ---- | -------- |
|
||||
| 09:00 | 24 | LGA |
|
||||
| 09:00 | 20 | BOS |
|
||||
| 10:00 | 26 | LGA |
|
||||
| 10:00 | 22 | BOS |
|
||||
|
||||
The table format is _long_ formatted time series, also called _tall_. It has repeated time stamps, and repeated values in Location. In this case, we have two time series in the set that would be identified as `Temp {Location=LGA}` and `Temp {Location=BOS}`.
|
||||
|
||||
Individual time series from the set are extracted by using the time typed column `StartTime` as the time index of the time series, the numeric typed column `Temp` as the series name, and the name and values of the string typed `Location` column to build the labels, such as Location=LGA.
|
||||
|
||||
### Multiple dimensions
|
||||
|
||||
If the query is updated to select and group by more than just one string column, for example, `GROUP BY BUCKET(StartTime, 1h), Location, Sensor`, then an additional dimension is added:
|
||||
|
||||
| StartTime | Temp | Location | Sensor |
|
||||
| ---------- | ---- | -------- | ------ |
|
||||
| 09:00 | 24 | LGA | A |
|
||||
| 09:00 | 24.1 | LGA | B |
|
||||
| 09:00 | 20 | BOS | A |
|
||||
| 09:00 | 20.2 | BOS | B |
|
||||
| 10:00 | 26 | LGA | A |
|
||||
| 10:00 | 26.1 | LGA | B |
|
||||
| 10:00 | 22 | BOS | A |
|
||||
| 10:00 | 22.2 | BOS | B |
|
||||
|
||||
In this case the labels that represent the dimensions will have two keys based on the two string typed columns `Location` and `Sensor`. This data results four series: `Temp {Location=LGA,Sensor=A}`, `Temp {Location=LGA,Sensor=B}`, `Temp {Location=BOS,Sensor=A}`, and `Temp {Location=BOS,Sensor=B}`.
|
||||
|
||||
**Note:** More than one dimension for SQL data sources is currently only supported in the Analytics services with the Azure monitor service as of version 7.1. Support for SQL data sources such as MySQL, Postgres, and MSSQL is planned to be added for 7.2.
|
||||
|
||||
**Note:** Multiple dimensions are not supported in a way that maps to multiple alerts in Grafana, but rather they are treated as multiple conditions to a single alert. See the documentation on [creating alerts with multiple series]({{< relref "../alerting/create-alerts.md#multiple-series" >}}).
|
||||
|
||||
### Multiple values
|
||||
|
||||
In the case SQL-like data sources, more than one numeric column can be selected, without or without additional string columns to be used as dimensions. For example, ` AVG(Temperature) AS AvgTemp, MAX(Temperature) AS MaxTemp`. This, if combined with multiple dimensions can result in a lot of series. Selecting multiple values is currently only designed to be used with visualization.
|
||||
|
||||
Additional technical information on tabular time series formats and how dimensions are extracted can be found in [the developer documentation on data frames as time series]({{< relref "../developers/plugins/data-frames.md#data-frames-as-time-series" >}}).
|
||||
@@ -3,8 +3,8 @@ title = "Time series"
|
||||
description = "Introduction to time series"
|
||||
keywords = ["grafana", "intro", "guide", "concepts", "timeseries"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
aliases = ["/docs/grafana/latest/guides/timeseries"]
|
||||
[menu.docs]
|
||||
name = "Time series"
|
||||
identifier = "time_series"
|
||||
parent = "guides"
|
||||
|
||||
@@ -51,7 +51,7 @@ The Prometheus data source now support transforming Prometheus histograms to the
|
||||
really happy to finally allow our users to render those as heatmaps. Please read [Heatmap panel documentation](/features/panels/heatmap/#pre-bucketed-data)
|
||||
for more information on how to use it.
|
||||
|
||||
Prometheus query editor also got support for autocomplete of template variables. More information in the [Prometheus data source documentation](/features/datasources/prometheus/).
|
||||
Prometheus query editor also got support for autocomplete of template variables. More information in the [Prometheus data source documentation]({{< relref "../features/datasources/prometheus/" >}}).
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
@@ -63,7 +63,7 @@ Grafana v5.1 now ships with a built-in Microsoft SQL Server (MSSQL) data source
|
||||
Microsoft SQL Server 2005 or newer, including Microsoft Azure SQL Database. Do you have metric or log data in MSSQL? You can now visualize
|
||||
that data and define alert rules on it like with any of Grafana's other core data sources.
|
||||
|
||||
Please read [Using Microsoft SQL Server in Grafana documentation](/features/datasources/mssql/) for more detailed information on how to get started and use it.
|
||||
Please read [Using Microsoft SQL Server in Grafana documentation]({{< relref "../features/datasources/mssql/" >}}) for more detailed information on how to get started and use it.
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ The Grafana Stackdriver plugin comes with support for automatic unit detection.
|
||||
The data source is still in the `beta` phase, meaning it's currently in active development and is still missing one important feature - templating queries.
|
||||
Please try it out, but be aware of that it might be subject to changes and possible bugs. We would love to hear your feedback.
|
||||
|
||||
Please read [Using Google Stackdriver in Grafana](/features/datasources/stackdriver/) for more detailed information on how to get started and use it.
|
||||
Please read [Using Google Stackdriver in Grafana]({{< relref "../features/datasources/cloudmonitoring/" >}}) for more detailed information on how to get started and use it.
|
||||
|
||||
## TV and Kiosk Mode
|
||||
|
||||
@@ -65,7 +65,7 @@ Learn how to enable and configure reminders [here](/alerting/notifications/#send
|
||||
|
||||
## Postgres Query Builder
|
||||
|
||||
Grafana 5.3 comes with a new graphical query builder for Postgres. This brings Postgres integration more in line with some of the other data sources and makes it easier for both advanced users and beginners to work with timeseries in Postgres. Learn more about it in the [documentation](/features/datasources/postgres/#query-editor).
|
||||
Grafana 5.3 comes with a new graphical query builder for Postgres. This brings Postgres integration more in line with some of the other data sources and makes it easier for both advanced users and beginners to work with timeseries in Postgres. Learn more about it in the [documentation]({{< relref "../features/datasources/postgres/#query-editor" >}}).
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v53/postgres_query_still.png" class="docs-image--no-shadow" animated-gif="/img/docs/v53/postgres_query.gif" >}}
|
||||
|
||||
|
||||
@@ -47,15 +47,15 @@ Stackdriver is the first data source which has support for a custom templating q
|
||||
create their very own templating query editor.
|
||||
|
||||
Additionally, if Grafana is running on a Google Compute Engine (GCE) virtual machine, it is now possible for Grafana to automatically retrieve default credentials from the metadata server.
|
||||
This has the advantage of not needing to generate a private key file for the service account and also not having to upload the file to Grafana. [Learn more](/features/datasources/stackdriver/#using-gce-default-service-account).
|
||||
This has the advantage of not needing to generate a private key file for the service account and also not having to upload the file to Grafana. [Learn more]({{< relref "../features/datasources/cloudmonitoring/#using-gce-default-service-account" >}}).
|
||||
|
||||
Please read [Using Google Stackdriver in Grafana](/features/datasources/stackdriver/) for more detailed information on how to get started and use it.
|
||||
Please read [Using Google Stackdriver in Grafana]({{< relref "../features/datasources/cloudmonitoring/" >}}) for more detailed information on how to get started and use it.
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
## MySQL Query Builder
|
||||
|
||||
Grafana v5.4 comes with a new graphical query builder for MySQL. This brings MySQL integration more in line with some of the other data sources and makes it easier for both advanced users and beginners to work with timeseries in MySQL. Learn more about it in the [documentation](/features/datasources/mysql/#query-editor).
|
||||
Grafana v5.4 comes with a new graphical query builder for MySQL. This brings MySQL integration more in line with some of the other data sources and makes it easier for both advanced users and beginners to work with timeseries in MySQL. Learn more about it in the [documentation]({{< relref "../features/datasources/mysql/#query-editor" >}}).
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v54/mysql_query_still.png" animated-gif="/img/docs/v54/mysql_query.gif" >}}
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ We are introducing a new unique identifier (`uid`) in the dashboard JSON model.
|
||||
generated if not provided when creating a dashboard and will have a length of 9-12 characters.
|
||||
|
||||
The unique identifier allows having persistent URLs for accessing dashboards, sharing them
|
||||
between instances and when using [dashboard provisioning](#dashboards). This means that dashboard can
|
||||
between instances and when using [dashboard provisioning]((/administration/provisioning/#reusable-dashboard-urls)). This means that dashboard can
|
||||
be renamed without breaking any links. We're changing the URL format for dashboards
|
||||
from `/dashboard/db/:slug` to `/d/:uid/:slug`. We'll keep supporting the old slug-based URLs for dashboards
|
||||
and redirects to the new one for backward compatibility. Please note that the old slug-based URLs
|
||||
|
||||
@@ -21,8 +21,8 @@ The main highlights are:
|
||||
- [Gauge Panel]({{< relref "#gauge-panel" >}}) - A new standalone panel for gauges.
|
||||
- [New Panel Editor UX]({{< relref "#new-panel-editor" >}}) improves panel editing
|
||||
and enables easy switching between different visualizations.
|
||||
- [Google Stackdriver data source]({{< relref "#google-stackdriver-datasource" >}}) is out of beta and is officially released.
|
||||
- [Azure Monitor]({{< relref "#azure-monitor-datasource" >}}) plugin is ported from being an external plugin to being a core data source
|
||||
- [Google Stackdriver data source]({{< relref "#google-stackdriver-data-source" >}}) is out of beta and is officially released.
|
||||
- [Azure Monitor]({{< relref "#azure-monitor-data-source" >}}) plugin is ported from being an external plugin to being a core data source
|
||||
- [React Plugin]({{< relref "#react-panels-query-editors" >}}) support enables an easier way to build plugins.
|
||||
- [Named Colors]({{< relref "#named-colors" >}}) in our new improved color picker.
|
||||
- [Removal of user session storage]({{< relref "#easier-to-deploy-improved-security" >}}) makes Grafana easier to deploy and improves security.
|
||||
@@ -116,7 +116,7 @@ will be shared soon.
|
||||
|
||||
Built-in support for [Google Stackdriver](https://cloud.google.com/stackdriver/) is officially released in Grafana 6.0. Beta support was added in Grafana 5.3 and we have added lots of improvements since then.
|
||||
|
||||
To get started read the guide: [Using Google Stackdriver in Grafana](/features/datasources/stackdriver/).
|
||||
To get started read the guide: [Using Google Stackdriver in Grafana]({{< relref "../features/datasources/cloudmonitoring/" >}}).
|
||||
|
||||
## Azure Monitor data source
|
||||
|
||||
@@ -124,7 +124,7 @@ One of the goals of the Grafana v6.0 release is to add support for the three maj
|
||||
|
||||
The Azure Monitor data source integrates four Azure services with Grafana - Azure Monitor, Azure Log Analytics, Azure Application Insights and Azure Application Insights Analytics.
|
||||
|
||||
Please read [Using Azure Monitor in Grafana documentation](/features/datasources/azuremonitor/) for more detailed information on how to get started and use it.
|
||||
Please read [Using Azure Monitor in Grafana documentation]({{< relref "../features/datasources/azuremonitor/" >}}) for more detailed information on how to get started and use it.
|
||||
|
||||
## Provisioning support for alert notifiers
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ To mitigate the risk of sensitive information being cached in browser after a us
|
||||
|
||||
## Official support for Elasticsearch 7
|
||||
|
||||
Grafana v6.2 ships with official support for Elasticsearch v7, see [Using Elasticsearch in Grafana](/features/datasources/elasticsearch/#elasticsearch-version) for more information.
|
||||
Grafana v6.2 ships with official support for Elasticsearch v7, see [Using Elasticsearch in Grafana]({{< relref "../features/datasources/elasticsearch/#elasticsearch-version" >}}) for more information.
|
||||
|
||||
## Bar Gauge Panel
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ simplified query interface specifically designed for logs search.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v63/elasticsearch_explore_logs.png" max-width="600px" caption="New Time Picker" >}}
|
||||
|
||||
Please read [Using Elasticsearch in Grafana](/features/datasources/elasticsearch/#querying-logs-beta) for more detailed information on how to get started and use it.
|
||||
Please read [Using Elasticsearch in Grafana]({{< relref "../features/datasources/elasticsearch/#elasticsearch-version" >}}) for more detailed information on how to get started and use it.
|
||||
|
||||
### InfluxDB logs support
|
||||
|
||||
@@ -59,7 +59,7 @@ simplified query interface specifically designed for logs search.
|
||||
|
||||
{{< docs-imagebox img="/img/docs/v63/influxdb_explore_logs.png" max-width="600px" caption="New Time Picker" >}}
|
||||
|
||||
Please read [Using InfluxDB in Grafana](/features/datasources/influxdb/#querying-logs-beta) for more detailed information on how to get started and use it.
|
||||
Please read [Using InfluxDB in Grafana]({{< relref "../features/datasources/influxdb/#querying-logs-beta" >}}) for more detailed information on how to get started and use it.
|
||||
|
||||
## Data Links
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user