Compare commits
626 Commits
sriram/SQL
...
v9.4.17
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d24c8aa315 | ||
|
|
f7685bafec | ||
|
|
ddcd6dad88 | ||
|
|
3e90f6e1d5 | ||
|
|
a5a8208b2d | ||
|
|
b6d733e755 | ||
|
|
78ec819807 | ||
|
|
0ceb86a4c4 | ||
|
|
6d1747ff16 | ||
|
|
d442068cdc | ||
|
|
a86847aff2 | ||
|
|
ff961d322e | ||
|
|
d868da883e | ||
|
|
a55a38d191 | ||
|
|
c37cebb26f | ||
|
|
aa758499ea | ||
|
|
82ac2432d4 | ||
|
|
0f6c2b6954 | ||
|
|
56a1bf85ea | ||
|
|
b887f7eca6 | ||
|
|
cc532753be | ||
|
|
0eb06914bd | ||
|
|
8562a9732c | ||
|
|
7911bfe2d0 | ||
|
|
49d3cf745f | ||
|
|
1e00f2e0ab | ||
|
|
ac29b6662d | ||
|
|
fa6ddc2fba | ||
|
|
e04c22c3b7 | ||
|
|
b0e2eae439 | ||
|
|
01466f0fd9 | ||
|
|
b68e5715e8 | ||
|
|
bd1c66f220 | ||
|
|
9aeb1db384 | ||
|
|
d1485fed57 | ||
|
|
135c74bd95 | ||
|
|
b347249fa9 | ||
|
|
56ad16ffc4 | ||
|
|
7165da76cb | ||
|
|
c583fc795e | ||
|
|
d7ba054f30 | ||
|
|
67c5afb44b | ||
|
|
a9bae1ad62 | ||
|
|
e0806338ab | ||
|
|
257a489d38 | ||
|
|
14ca449530 | ||
|
|
8aa4245fe4 | ||
|
|
abd2ccc250 | ||
|
|
b8120d421d | ||
|
|
4201e7faea | ||
|
|
9203d5b116 | ||
|
|
d5d838eaa1 | ||
|
|
549387b831 | ||
|
|
c8687a78ff | ||
|
|
f35d160b67 | ||
|
|
7e71245181 | ||
|
|
41c04aecbb | ||
|
|
e925841872 | ||
|
|
3c987bd8c4 | ||
|
|
64307da9ea | ||
|
|
95a61e652a | ||
|
|
32830edc60 | ||
|
|
97aabc8497 | ||
|
|
c6634f3780 | ||
|
|
da681e13f2 | ||
|
|
e3be6812ce | ||
|
|
0817676d9e | ||
|
|
4333d651e1 | ||
|
|
20f001649e | ||
|
|
c465fa856e | ||
|
|
98d339bc12 | ||
|
|
55abd83948 | ||
|
|
be7557306c | ||
|
|
5481d29428 | ||
|
|
093ea7cd47 | ||
|
|
3ecbd728b3 | ||
|
|
aff2783e68 | ||
|
|
14484c46ad | ||
|
|
672a4d1590 | ||
|
|
211bfd2f4d | ||
|
|
89c1e4c35e | ||
|
|
c922a5f956 | ||
|
|
a4ab5bfaad | ||
|
|
6480b50187 | ||
|
|
6ab231d61d | ||
|
|
19ea031bbd | ||
|
|
f09edce739 | ||
|
|
fe5305ffeb | ||
|
|
fa72114b45 | ||
|
|
51b8889874 | ||
|
|
3e8916aa81 | ||
|
|
edba3a2467 | ||
|
|
8dcfb83de4 | ||
|
|
4486f323ec | ||
|
|
1d34f16a3f | ||
|
|
db737d1d96 | ||
|
|
47e4a2f886 | ||
|
|
fda6f03ec9 | ||
|
|
b1d68dc18d | ||
|
|
54e65f25b7 | ||
|
|
3db20d0149 | ||
|
|
cb7a0bb612 | ||
|
|
28005f8baa | ||
|
|
1a333623cf | ||
|
|
5829fdd399 | ||
|
|
1a07dc5db0 | ||
|
|
f829ae71db | ||
|
|
43e78fa1a6 | ||
|
|
351450bfe0 | ||
|
|
69848e4349 | ||
|
|
28767f8a67 | ||
|
|
ccbd6d0afb | ||
|
|
b8ad4e0bb4 | ||
|
|
4add393ff0 | ||
|
|
b640eb0c85 | ||
|
|
ed6169688e | ||
|
|
85637f0355 | ||
|
|
b3b5a9a999 | ||
|
|
4c56cef6af | ||
|
|
4c7ff6cff3 | ||
|
|
1bb101b1ce | ||
|
|
ca2c251be6 | ||
|
|
c251570039 | ||
|
|
c1cddece45 | ||
|
|
37fc161fd9 | ||
|
|
9117cec064 | ||
|
|
1a714ed0f5 | ||
|
|
f4064da4b5 | ||
|
|
0850edc137 | ||
|
|
12c6626a42 | ||
|
|
e5d8b486a6 | ||
|
|
66f195ca77 | ||
|
|
c659f65ac0 | ||
|
|
5cbce7b951 | ||
|
|
8c42bef420 | ||
|
|
d3d03312c3 | ||
|
|
c97d52e238 | ||
|
|
8faf41ff7f | ||
|
|
f30c03c281 | ||
|
|
1e75a11e6b | ||
|
|
ce81d3d30a | ||
|
|
92f437a5f2 | ||
|
|
16b542a3e6 | ||
|
|
0167cb7ff8 | ||
|
|
f6273ebb06 | ||
|
|
4c1f6cca24 | ||
|
|
de801f532d | ||
|
|
457b4b208b | ||
|
|
0828eaa14c | ||
|
|
832e89dad0 | ||
|
|
caa6545292 | ||
|
|
0ac3eb956b | ||
|
|
4cf03f5004 | ||
|
|
e3f05514d3 | ||
|
|
6d94ee5411 | ||
|
|
8be48da766 | ||
|
|
ef87202878 | ||
|
|
d448263073 | ||
|
|
fc447be8ac | ||
|
|
f498b4d821 | ||
|
|
f781e6fb7e | ||
|
|
e6ed9908e3 | ||
|
|
37a8711985 | ||
|
|
cd0854f1bc | ||
|
|
0d7c6950b9 | ||
|
|
58b306eacf | ||
|
|
0d80fc0da0 | ||
|
|
14d0a0cfd5 | ||
|
|
8ba86ce233 | ||
|
|
7daa240753 | ||
|
|
136cb16a52 | ||
|
|
324ba5c62b | ||
|
|
81d4d8f228 | ||
|
|
70d0b7a0d2 | ||
|
|
4b802788f5 | ||
|
|
048de5d09a | ||
|
|
ad2a920191 | ||
|
|
c794e68ea2 | ||
|
|
4d944081bc | ||
|
|
3b6ed3340d | ||
|
|
bba6777982 | ||
|
|
1c1be82eb9 | ||
|
|
409cec2e41 | ||
|
|
55e05cc833 | ||
|
|
0fb2bd25d3 | ||
|
|
c0ca04e9a3 | ||
|
|
bcf4e758dc | ||
|
|
c8077a982e | ||
|
|
53d8071192 | ||
|
|
b31c0b7897 | ||
|
|
cd2ea25f54 | ||
|
|
fb9429b1f7 | ||
|
|
f5da579af9 | ||
|
|
ec973b648a | ||
|
|
b3b956b01e | ||
|
|
9fa0ec2047 | ||
|
|
eacc0bafea | ||
|
|
11b98de351 | ||
|
|
4a07a2dc5d | ||
|
|
9cb76776af | ||
|
|
a0be1550eb | ||
|
|
9daf1363df | ||
|
|
93af60149d | ||
|
|
203becbf33 | ||
|
|
896f2ce04f | ||
|
|
2ea3929354 | ||
|
|
126426e15e | ||
|
|
ef6fdcd710 | ||
|
|
a2fea9af76 | ||
|
|
d12a747a5d | ||
|
|
bcdc8cd5ab | ||
|
|
1b2f5a3798 | ||
|
|
eafc315dc1 | ||
|
|
2760aa808d | ||
|
|
9b77be4a08 | ||
|
|
2ca13f2b57 | ||
|
|
fbb48cb826 | ||
|
|
a567819719 | ||
|
|
ff88bb0102 | ||
|
|
6a80a658b8 | ||
|
|
30504b6857 | ||
|
|
be58e9f116 | ||
|
|
ad4357b07e | ||
|
|
04d7c5f790 | ||
|
|
ee278fe3b9 | ||
|
|
101927cf04 | ||
|
|
9ec538568a | ||
|
|
63ecb1c359 | ||
|
|
885057c4d2 | ||
|
|
8f169dc42d | ||
|
|
1e7a0c9738 | ||
|
|
82f3e6f5a7 | ||
|
|
f5f29e203b | ||
|
|
59898b231c | ||
|
|
0fdb063576 | ||
|
|
6d1b00c745 | ||
|
|
44c3c5f269 | ||
|
|
ded351dc79 | ||
|
|
2a6ac647d2 | ||
|
|
ac8fd7966a | ||
|
|
eb2d0db641 | ||
|
|
46232f03bb | ||
|
|
ffe711cb14 | ||
|
|
63347e0da2 | ||
|
|
647edf7f58 | ||
|
|
4a7153cabe | ||
|
|
1f415749a0 | ||
|
|
e37bbc7178 | ||
|
|
50d9084d35 | ||
|
|
f650293066 | ||
|
|
a7ac9d0b3b | ||
|
|
36470ebcf3 | ||
|
|
5d2034188b | ||
|
|
b4d141ed1c | ||
|
|
8f761197a4 | ||
|
|
d6785c9223 | ||
|
|
6286cba8ee | ||
|
|
0ec31973de | ||
|
|
cd8cd0f246 | ||
|
|
21e2f26688 | ||
|
|
49680128cd | ||
|
|
edae149230 | ||
|
|
0366e6f469 | ||
|
|
0a2401f393 | ||
|
|
bca5541355 | ||
|
|
a5b8b383e6 | ||
|
|
19cc5aae59 | ||
|
|
2a3f141ca5 | ||
|
|
bfb21e7621 | ||
|
|
cd323622b7 | ||
|
|
b0c69c9eec | ||
|
|
0c3bf3f0e9 | ||
|
|
b40bf8b3f5 | ||
|
|
876f6e8727 | ||
|
|
1148da45d3 | ||
|
|
d37fa06f05 | ||
|
|
f9f0dd8b1b | ||
|
|
1daa365107 | ||
|
|
cd4cb967a5 | ||
|
|
285d5809c5 | ||
|
|
7d7751d5b0 | ||
|
|
53d2e59cff | ||
|
|
bf3f1368a7 | ||
|
|
8500eb1c18 | ||
|
|
f13eff4287 | ||
|
|
ecaeafd4f3 | ||
|
|
e9d53761fb | ||
|
|
66e3f8dc23 | ||
|
|
fc6b8f9c6c | ||
|
|
76c3e1863b | ||
|
|
a3ef453ff6 | ||
|
|
37f2a0aa32 | ||
|
|
1b9abfeec8 | ||
|
|
3bf0352fbb | ||
|
|
132900fe2e | ||
|
|
009fa712c2 | ||
|
|
413ac1ec7d | ||
|
|
266a7407f6 | ||
|
|
90db06d65b | ||
|
|
a080d453b4 | ||
|
|
8374ef84df | ||
|
|
ef6476d92b | ||
|
|
144efd25b8 | ||
|
|
cb5c92a375 | ||
|
|
6a73b2b726 | ||
|
|
d3c37d28ed | ||
|
|
1b8d220d96 | ||
|
|
8fad42fa6f | ||
|
|
9d00d07a6a | ||
|
|
7b874aa327 | ||
|
|
0d7efc076c | ||
|
|
d14faf3cc0 | ||
|
|
67dd929f5e | ||
|
|
72dad41413 | ||
|
|
84e9267612 | ||
|
|
9bafdcb72a | ||
|
|
bb3e08a0a1 | ||
|
|
0680231781 | ||
|
|
8288d962ef | ||
|
|
bd37c60b50 | ||
|
|
e37fb197b2 | ||
|
|
0f87c31a2c | ||
|
|
97fc76da27 | ||
|
|
54fe185e80 | ||
|
|
96d1d9981d | ||
|
|
f54cf0865a | ||
|
|
ffe9b71a27 | ||
|
|
4a825cad7b | ||
|
|
ca91072d5b | ||
|
|
b1c73a9984 | ||
|
|
721605af13 | ||
|
|
950b15d0aa | ||
|
|
788dc25416 | ||
|
|
744c1164e7 | ||
|
|
2c6ad8867f | ||
|
|
4b6a015256 | ||
|
|
4452c15714 | ||
|
|
4b95a36e82 | ||
|
|
612edc2665 | ||
|
|
fa2a8b2bd5 | ||
|
|
29d69eb16f | ||
|
|
553b90d1e7 | ||
|
|
50952f0a7a | ||
|
|
bc4e9e3215 | ||
|
|
6a1d736f03 | ||
|
|
bf3422740b | ||
|
|
231cb2b835 | ||
|
|
a440178397 | ||
|
|
85c794d932 | ||
|
|
1f498f9ff7 | ||
|
|
7e5e3d78d0 | ||
|
|
c5f4ef6c3e | ||
|
|
69a7d5d6a6 | ||
|
|
3d1085c6ad | ||
|
|
5d6a6677a2 | ||
|
|
b5c092f03e | ||
|
|
46030b3b69 | ||
|
|
0e11822954 | ||
|
|
bf832c93e7 | ||
|
|
412f1c1cc6 | ||
|
|
10a2245f93 | ||
|
|
12013e9aa4 | ||
|
|
56d1dcc9b3 | ||
|
|
b5a274f392 | ||
|
|
08acfafffd | ||
|
|
fc8002d9ab | ||
|
|
75a44af935 | ||
|
|
53a06bf65f | ||
|
|
7a26957f87 | ||
|
|
d75b8c13ef | ||
|
|
01917df71a | ||
|
|
b7ff4d1661 | ||
|
|
eaace4fc45 | ||
|
|
039d9c379c | ||
|
|
6bce4d516d | ||
|
|
332e870086 | ||
|
|
6f22584d26 | ||
|
|
961446e7e1 | ||
|
|
419e8d782c | ||
|
|
aa09499343 | ||
|
|
cf3f234a54 | ||
|
|
de7d18d4e0 | ||
|
|
7f6c61f0bd | ||
|
|
47e1860e34 | ||
|
|
db9dfc7aef | ||
|
|
0d561b6c24 | ||
|
|
9bccf165be | ||
|
|
936e72f1e6 | ||
|
|
b66e903439 | ||
|
|
2911eec518 | ||
|
|
ea660e188e | ||
|
|
3b523c13a7 | ||
|
|
4474649869 | ||
|
|
772eb4b58a | ||
|
|
9e0cb259ee | ||
|
|
e272ce8274 | ||
|
|
2d0324ec70 | ||
|
|
5a6471c01f | ||
|
|
0d2a01f03f | ||
|
|
4c38e25ecd | ||
|
|
52288b87aa | ||
|
|
84e358660a | ||
|
|
269ae0d7be | ||
|
|
24e46f3ae7 | ||
|
|
232cbed853 | ||
|
|
c5583207ee | ||
|
|
c48ca77815 | ||
|
|
5fb2986aa5 | ||
|
|
6772c060d8 | ||
|
|
f918b3bf9d | ||
|
|
49ef18b2b7 | ||
|
|
f80239c21a | ||
|
|
bf6e7d2abe | ||
|
|
ddf5363aa6 | ||
|
|
a9faf4b9f1 | ||
|
|
8c12f75b0b | ||
|
|
5014df0521 | ||
|
|
5ccddbe071 | ||
|
|
6d0beaedaf | ||
|
|
8c1d16c879 | ||
|
|
4ee064da11 | ||
|
|
1548edc40e | ||
|
|
aad839e5b9 | ||
|
|
aa60a45f6b | ||
|
|
bdf8b7531b | ||
|
|
9ef2e8d7da | ||
|
|
79fb770ca5 | ||
|
|
b733b4fd5c | ||
|
|
a2b984cd7e | ||
|
|
0d7de2bbda | ||
|
|
1ad9362310 | ||
|
|
8861a8a977 | ||
|
|
f8df798afd | ||
|
|
25c31c2c7c | ||
|
|
3fe53ab222 | ||
|
|
4e687dfb6f | ||
|
|
eab26273d6 | ||
|
|
35fe167f0d | ||
|
|
5e48a1ad06 | ||
|
|
225128a5d9 | ||
|
|
64412b1195 | ||
|
|
0299b18b88 | ||
|
|
8c483cca31 | ||
|
|
4c22a2b8fb | ||
|
|
0de3ceb47c | ||
|
|
bb25297a9d | ||
|
|
b5135d8144 | ||
|
|
1b0d442ca2 | ||
|
|
38b5dd4486 | ||
|
|
66b94cd468 | ||
|
|
a7c1598ca6 | ||
|
|
437cf15105 | ||
|
|
6cab7f956c | ||
|
|
b23f3964e9 | ||
|
|
0b98b4d241 | ||
|
|
04a4774d4c | ||
|
|
3c58b2c176 | ||
|
|
a1bceeb1d3 | ||
|
|
bb7a485dbf | ||
|
|
b3682d498c | ||
|
|
183f9317c5 | ||
|
|
194dbead83 | ||
|
|
53b5cf5288 | ||
|
|
7900e795f1 | ||
|
|
0f1f842015 | ||
|
|
7e017790d2 | ||
|
|
3531683e87 | ||
|
|
b5747d397d | ||
|
|
f8120e9152 | ||
|
|
ae94a60981 | ||
|
|
65c2b4fea2 | ||
|
|
f18c84af5a | ||
|
|
c10b18d06e | ||
|
|
a3b692e1c5 | ||
|
|
30f3f63bd6 | ||
|
|
758783a2e2 | ||
|
|
5585dc0ba1 | ||
|
|
2012cd7954 | ||
|
|
77263b8e65 | ||
|
|
3e30c2024c | ||
|
|
cb13b75c6b | ||
|
|
242e05f448 | ||
|
|
7f6319393d | ||
|
|
57ecd3d3d3 | ||
|
|
edd755b834 | ||
|
|
db978cd48a | ||
|
|
6162e6f823 | ||
|
|
8e4fa99ec7 | ||
|
|
8aaca53a32 | ||
|
|
9eefd2e42a | ||
|
|
045aff4009 | ||
|
|
e9b269a5b8 | ||
|
|
fcc6c7c486 | ||
|
|
92ac380621 | ||
|
|
98489d5f81 | ||
|
|
60e88ffcb7 | ||
|
|
249c5b013e | ||
|
|
4ddc76f73e | ||
|
|
b6dc902ec0 | ||
|
|
479360e6bf | ||
|
|
f9845a6d70 | ||
|
|
96121adda2 | ||
|
|
56b478f84d | ||
|
|
7451db3f26 | ||
|
|
0bddceb24c | ||
|
|
65de5b497b | ||
|
|
edd529c2cf | ||
|
|
17605f97af | ||
|
|
e5d80f21e9 | ||
|
|
f69374abbd | ||
|
|
ec2082c172 | ||
|
|
3574fa5996 | ||
|
|
982624f7b1 | ||
|
|
69453133e7 | ||
|
|
8a489712cc | ||
|
|
87f6fef9d7 | ||
|
|
371149fa02 | ||
|
|
845b797b5b | ||
|
|
45dd9f9a9f | ||
|
|
8a8180c44d | ||
|
|
532fc8dd2c | ||
|
|
0d648ea977 | ||
|
|
23ac2de4d3 | ||
|
|
87497a1afc | ||
|
|
3c7cfecf50 | ||
|
|
63f1d95ed6 | ||
|
|
238f51fb73 | ||
|
|
88e8d97ad3 | ||
|
|
bd14abb309 | ||
|
|
96fa91e113 | ||
|
|
0ca7d1e210 | ||
|
|
200c94c722 | ||
|
|
7589dbe784 | ||
|
|
005fb9586c | ||
|
|
cb898dfe66 | ||
|
|
3dffe4099b | ||
|
|
d9710139e1 | ||
|
|
8e9fb8cf93 | ||
|
|
fba376b347 | ||
|
|
6895e75f70 | ||
|
|
4f826bc76c | ||
|
|
efaf4f5e09 | ||
|
|
907381ed5c | ||
|
|
8c9cb8e839 | ||
|
|
028cc7e72b | ||
|
|
00555606d5 | ||
|
|
9cf5b4eb9e | ||
|
|
8637518540 | ||
|
|
0c27df8b8c | ||
|
|
8fd1547edb | ||
|
|
21f204d35a | ||
|
|
84da688400 | ||
|
|
b742567ade | ||
|
|
385b15bf69 | ||
|
|
94ec932d29 | ||
|
|
2525b30803 | ||
|
|
324964b86b | ||
|
|
d31f932800 | ||
|
|
363171b182 | ||
|
|
32e3cd7cbc | ||
|
|
2a223cbea2 | ||
|
|
c7a182e9d5 | ||
|
|
d8f757cb8c | ||
|
|
bfe6b520d7 | ||
|
|
190c3aad58 | ||
|
|
022abcb47d | ||
|
|
5b305cb696 | ||
|
|
a03069fb08 | ||
|
|
0413fea8d2 | ||
|
|
30081ca04b | ||
|
|
53a1e5b7e6 | ||
|
|
29cc5f9c62 | ||
|
|
b485d1cde9 | ||
|
|
045c2d4e59 | ||
|
|
654af9a48d | ||
|
|
5bb58c5172 | ||
|
|
42b9c898bf | ||
|
|
795c86b045 | ||
|
|
5d5e7f97e9 | ||
|
|
c8cf18d8f6 | ||
|
|
70e4499f83 | ||
|
|
2e251a2b20 | ||
|
|
cdec4eb6ab | ||
|
|
71a18da270 | ||
|
|
40354c6b40 | ||
|
|
68fb4da24a | ||
|
|
89f9081658 | ||
|
|
84d2814f7c | ||
|
|
193b671246 | ||
|
|
2bb672a7de | ||
|
|
c156621981 | ||
|
|
9a8983e8e9 | ||
|
|
4bdfc2d926 | ||
|
|
bd9707e8f3 | ||
|
|
3023a43d4f | ||
|
|
41b0393140 | ||
|
|
90a4c84bc2 | ||
|
|
6749e8667d | ||
|
|
9727346e63 | ||
|
|
3683b7a5ff | ||
|
|
f9ca726290 | ||
|
|
15ec06b593 | ||
|
|
953d9db30d | ||
|
|
a7b9dcdce8 | ||
|
|
76f3ed3c3f | ||
|
|
2ad87ce213 | ||
|
|
cc5b3c11c4 | ||
|
|
20731672ed | ||
|
|
f9ec04bbb7 | ||
|
|
0e6d038934 | ||
|
|
b8c6ff611d | ||
|
|
ecfd92ed30 | ||
|
|
8eb9971797 | ||
|
|
c567e690ad | ||
|
|
acf1b1285b | ||
|
|
3d65500a4f | ||
|
|
589284778a | ||
|
|
b9e989cbf2 | ||
|
|
f39c46a1b5 | ||
|
|
48bd8ebe92 | ||
|
|
34524d6dfa | ||
|
|
6e861b19fa | ||
|
|
26f7b8ee65 | ||
|
|
04dd4e7f7c | ||
|
|
992e5d72ff | ||
|
|
1b0f5f0a81 |
@@ -122,15 +122,14 @@ exports[`better eslint`] = {
|
|||||||
],
|
],
|
||||||
"packages/grafana-data/src/datetime/moment_wrapper.ts:5381": [
|
"packages/grafana-data/src/datetime/moment_wrapper.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
[0, 0, 0, "Do not use any type assertions.", "1"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "2"],
|
[0, 0, 0, "Do not use any type assertions.", "2"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "3"],
|
[0, 0, 0, "Do not use any type assertions.", "3"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "4"],
|
[0, 0, 0, "Do not use any type assertions.", "4"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "5"],
|
[0, 0, 0, "Do not use any type assertions.", "5"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "6"],
|
[0, 0, 0, "Do not use any type assertions.", "6"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "7"],
|
[0, 0, 0, "Do not use any type assertions.", "7"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "8"],
|
[0, 0, 0, "Do not use any type assertions.", "8"]
|
||||||
[0, 0, 0, "Do not use any type assertions.", "9"]
|
|
||||||
],
|
],
|
||||||
"packages/grafana-data/src/datetime/parser.test.ts:5381": [
|
"packages/grafana-data/src/datetime/parser.test.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
@@ -575,8 +574,7 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "5"]
|
|
||||||
],
|
],
|
||||||
"packages/grafana-data/src/types/variables.ts:5381": [
|
"packages/grafana-data/src/types/variables.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
@@ -719,17 +717,6 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||||
],
|
],
|
||||||
"packages/grafana-data/src/utils/location.test.ts:5381": [
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "8"]
|
|
||||||
],
|
|
||||||
"packages/grafana-data/src/utils/location.ts:5381": [
|
"packages/grafana-data/src/utils/location.ts:5381": [
|
||||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
@@ -985,8 +972,9 @@ exports[`better eslint`] = {
|
|||||||
"packages/grafana-schema/src/veneer/dashboard.types.ts:5381": [
|
"packages/grafana-schema/src/veneer/dashboard.types.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "2"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "3"]
|
[0, 0, 0, "Do not use any type assertions.", "3"],
|
||||||
|
[0, 0, 0, "Do not use any type assertions.", "4"]
|
||||||
],
|
],
|
||||||
"packages/grafana-toolkit/src/cli/tasks/component.create.ts:5381": [
|
"packages/grafana-toolkit/src/cli/tasks/component.create.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
@@ -2140,9 +2128,6 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "8"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "8"]
|
||||||
],
|
],
|
||||||
"public/app/angular/services/nav_model_srv.ts:5381": [
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
|
||||||
],
|
|
||||||
"public/app/angular/services/ng_react.ts:5381": [
|
"public/app/angular/services/ng_react.ts:5381": [
|
||||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "1"],
|
[0, 0, 0, "Do not use any type assertions.", "1"],
|
||||||
@@ -4292,27 +4277,20 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "2"],
|
[0, 0, 0, "Do not use any type assertions.", "2"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "4"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "5"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "6"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "8"],
|
[0, 0, 0, "Do not use any type assertions.", "8"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "9"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
|
[0, 0, 0, "Do not use any type assertions.", "10"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "11"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "11"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "12"],
|
[0, 0, 0, "Do not use any type assertions.", "12"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "13"],
|
[0, 0, 0, "Do not use any type assertions.", "13"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "14"],
|
[0, 0, 0, "Do not use any type assertions.", "14"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "15"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "15"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "17"],
|
[0, 0, 0, "Do not use any type assertions.", "17"]
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "18"],
|
|
||||||
[0, 0, 0, "Do not use any type assertions.", "19"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "20"],
|
|
||||||
[0, 0, 0, "Do not use any type assertions.", "21"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "22"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "23"],
|
|
||||||
[0, 0, 0, "Do not use any type assertions.", "24"]
|
|
||||||
],
|
],
|
||||||
"public/app/features/plugins/importPanelPlugin.ts:5381": [
|
"public/app/features/plugins/importPanelPlugin.ts:5381": [
|
||||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||||
@@ -5511,10 +5489,7 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "6"]
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "8"],
|
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "9"]
|
|
||||||
],
|
],
|
||||||
"public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/response_parser.ts:5381": [
|
"public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/response_parser.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
@@ -5863,7 +5838,7 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
],
|
],
|
||||||
"public/app/plugins/datasource/influxdb/datasource.ts:5381": [
|
"public/app/plugins/datasource/influxdb/datasource.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||||
@@ -5875,23 +5850,27 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "11"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "11"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "12"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "12"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "13"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "13"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "14"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "14"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "15"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "15"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
[0, 0, 0, "Do not use any type assertions.", "16"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "17"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "17"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "18"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "18"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "19"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "19"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "20"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "20"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "21"],
|
[0, 0, 0, "Do not use any type assertions.", "21"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "22"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "22"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "23"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "23"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "24"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "24"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "25"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "25"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "26"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "26"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "27"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "27"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "28"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "28"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "29"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "30"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "31"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "32"]
|
||||||
],
|
],
|
||||||
"public/app/plugins/datasource/influxdb/influx_query_model.ts:5381": [
|
"public/app/plugins/datasource/influxdb/influx_query_model.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
@@ -5913,8 +5892,28 @@ exports[`better eslint`] = {
|
|||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "17"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "17"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "18"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "18"],
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "19"],
|
[0, 0, 0, "Unexpected any. Specify a different type.", "19"]
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "20"]
|
],
|
||||||
|
"public/app/plugins/datasource/influxdb/influx_series.ts:5381": [
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "8"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "11"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "12"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "13"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "14"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "15"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "17"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "18"]
|
||||||
],
|
],
|
||||||
"public/app/plugins/datasource/influxdb/migrations.ts:5381": [
|
"public/app/plugins/datasource/influxdb/migrations.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
@@ -6036,6 +6035,11 @@ exports[`better eslint`] = {
|
|||||||
"public/app/plugins/datasource/loki/LiveStreams.ts:5381": [
|
"public/app/plugins/datasource/loki/LiveStreams.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
],
|
],
|
||||||
|
"public/app/plugins/datasource/loki/components/LokiContextUi.test.tsx:5381": [
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||||
|
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
|
||||||
|
],
|
||||||
"public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx:5381": [
|
"public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx:5381": [
|
||||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.7. DO NOT EDIT.
|
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT.
|
||||||
# All tools are designed to be build inside $GOBIN.
|
# All tools are designed to be build inside $GOBIN.
|
||||||
BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||||
GOPATH ?= $(shell go env GOPATH)
|
GOPATH ?= $(shell go env GOPATH)
|
||||||
@@ -35,11 +35,11 @@ $(DRONE): $(BINGO_DIR)/drone.mod
|
|||||||
@echo "(re)installing $(GOBIN)/drone-v1.5.0"
|
@echo "(re)installing $(GOBIN)/drone-v1.5.0"
|
||||||
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=drone.mod -o=$(GOBIN)/drone-v1.5.0 "github.com/drone/drone-cli/drone"
|
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=drone.mod -o=$(GOBIN)/drone-v1.5.0 "github.com/drone/drone-cli/drone"
|
||||||
|
|
||||||
GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.50.1
|
GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.51.2
|
||||||
$(GOLANGCI_LINT): $(BINGO_DIR)/golangci-lint.mod
|
$(GOLANGCI_LINT): $(BINGO_DIR)/golangci-lint.mod
|
||||||
@# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies.
|
@# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies.
|
||||||
@echo "(re)installing $(GOBIN)/golangci-lint-v1.50.1"
|
@echo "(re)installing $(GOBIN)/golangci-lint-v1.51.2"
|
||||||
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.50.1 "github.com/golangci/golangci-lint/cmd/golangci-lint"
|
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.51.2 "github.com/golangci/golangci-lint/cmd/golangci-lint"
|
||||||
|
|
||||||
JB := $(GOBIN)/jb-v0.5.1
|
JB := $(GOBIN)/jb-v0.5.1
|
||||||
$(JB): $(BINGO_DIR)/jb.mod
|
$(JB): $(BINGO_DIR)/jb.mod
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
|
|||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require github.com/golangci/golangci-lint v1.50.1 // cmd/golangci-lint
|
require github.com/golangci/golangci-lint v1.51.2 // cmd/golangci-lint
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
|
4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA=
|
||||||
|
4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs=
|
||||||
4d63.com/gochecknoglobals v0.1.0 h1:zeZSRqj5yCg28tCkIV/z/lWbwvNm5qnKVS15PI8nhD0=
|
4d63.com/gochecknoglobals v0.1.0 h1:zeZSRqj5yCg28tCkIV/z/lWbwvNm5qnKVS15PI8nhD0=
|
||||||
4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo=
|
4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo=
|
||||||
|
4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc=
|
||||||
|
4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU=
|
||||||
bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M=
|
bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M=
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
@@ -64,6 +68,8 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EU
|
|||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/Abirdcfly/dupword v0.0.7 h1:z14n0yytA3wNO2gpCD/jVtp/acEXPGmYu0esewpBt6Q=
|
github.com/Abirdcfly/dupword v0.0.7 h1:z14n0yytA3wNO2gpCD/jVtp/acEXPGmYu0esewpBt6Q=
|
||||||
github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk=
|
github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk=
|
||||||
|
github.com/Abirdcfly/dupword v0.0.9 h1:MxprGjKq3yDBICXDgEEsyGirIXfMYXkLNT/agPsE1tk=
|
||||||
|
github.com/Abirdcfly/dupword v0.0.9/go.mod h1:PzmHVLLZ27MvHSzV7eFmMXSFArWXZPZmfuuziuUrf2g=
|
||||||
github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako=
|
github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako=
|
||||||
github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU=
|
github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU=
|
||||||
github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q=
|
github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q=
|
||||||
@@ -110,6 +116,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj
|
|||||||
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
github.com/ashanbrown/forbidigo v1.3.0 h1:VkYIwb/xxdireGAdJNZoo24O4lmnEWkactplBlWTShc=
|
github.com/ashanbrown/forbidigo v1.3.0 h1:VkYIwb/xxdireGAdJNZoo24O4lmnEWkactplBlWTShc=
|
||||||
github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI=
|
github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI=
|
||||||
|
github.com/ashanbrown/forbidigo v1.4.0 h1:spdPbupaSqtWORq1Q4eHBoPBmHtwVyLKwaedbSLc5Sw=
|
||||||
|
github.com/ashanbrown/forbidigo v1.4.0/go.mod h1:IvgwB5Y4fzqSAj/WVXKWigoTkB0dzI2FBbpKWuh7ph8=
|
||||||
github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s=
|
github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s=
|
||||||
github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI=
|
github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI=
|
||||||
github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
@@ -126,6 +134,8 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ
|
|||||||
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
|
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
|
||||||
github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM=
|
github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM=
|
||||||
github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
|
github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
|
||||||
|
github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU=
|
||||||
|
github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo=
|
||||||
github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI=
|
github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI=
|
||||||
github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A=
|
github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A=
|
||||||
github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw=
|
github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw=
|
||||||
@@ -143,6 +153,8 @@ github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy
|
|||||||
github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg=
|
github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg=
|
||||||
github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI=
|
github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI=
|
||||||
github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To=
|
github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To=
|
||||||
|
github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 h1:cy5GCEZLUCshCGCRRUjxHrDUqkB4l5cuUt3ShEckQEo=
|
||||||
|
github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348/go.mod h1:f/miWtG3SSuTxKsNK3o58H1xl+XV6ZIfbC6p7lPPB8U=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
@@ -181,6 +193,8 @@ github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDU
|
|||||||
github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc=
|
github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc=
|
||||||
github.com/daixiang0/gci v0.8.1 h1:T4xpSC+hmsi4CSyuYfIJdMZAr9o7xZmHpQVygMghGZ4=
|
github.com/daixiang0/gci v0.8.1 h1:T4xpSC+hmsi4CSyuYfIJdMZAr9o7xZmHpQVygMghGZ4=
|
||||||
github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c=
|
github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c=
|
||||||
|
github.com/daixiang0/gci v0.9.1 h1:jBrwBmBZTDsGsXiaCTLIe9diotp1X4X64zodFrh7l+c=
|
||||||
|
github.com/daixiang0/gci v0.9.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c=
|
||||||
github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
@@ -212,6 +226,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL
|
|||||||
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||||
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
||||||
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
||||||
|
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
|
||||||
|
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
|
||||||
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
||||||
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
||||||
github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y=
|
github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y=
|
||||||
@@ -228,6 +244,8 @@ github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlya
|
|||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/go-critic/go-critic v0.6.5 h1:fDaR/5GWURljXwF8Eh31T2GZNz9X4jeboS912mWF8Uo=
|
github.com/go-critic/go-critic v0.6.5 h1:fDaR/5GWURljXwF8Eh31T2GZNz9X4jeboS912mWF8Uo=
|
||||||
github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY=
|
github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY=
|
||||||
|
github.com/go-critic/go-critic v0.6.7 h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM=
|
||||||
|
github.com/go-critic/go-critic v0.6.7/go.mod h1:fYZUijFdcnxgx6wPjQA2QEjIRaNCT0gO8bhexy6/QmE=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
@@ -245,23 +263,39 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
|
|||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||||
github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
|
github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
|
||||||
github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
|
github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
|
||||||
|
github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8=
|
||||||
|
github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU=
|
||||||
github.com/go-toolsmith/astcopy v1.0.2 h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0=
|
github.com/go-toolsmith/astcopy v1.0.2 h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0=
|
||||||
github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y=
|
github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y=
|
||||||
|
github.com/go-toolsmith/astcopy v1.0.3 h1:r0bgSRlMOAgO+BdQnVAcpMSMkrQCnV6ZJmIkrJgcJj0=
|
||||||
|
github.com/go-toolsmith/astcopy v1.0.3/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y=
|
||||||
github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
|
github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
|
||||||
github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4=
|
github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4=
|
||||||
github.com/go-toolsmith/astequal v1.0.3 h1:+LVdyRatFS+XO78SGV4I3TCEA0AC7fKEGma+fH+674o=
|
github.com/go-toolsmith/astequal v1.0.3 h1:+LVdyRatFS+XO78SGV4I3TCEA0AC7fKEGma+fH+674o=
|
||||||
github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4=
|
github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4=
|
||||||
|
github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw=
|
||||||
|
github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ=
|
||||||
github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
|
github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
|
||||||
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
|
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
|
||||||
|
github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco=
|
||||||
|
github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4=
|
||||||
github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
|
github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
|
||||||
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
|
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
|
||||||
|
github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA=
|
||||||
|
github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA=
|
||||||
github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM=
|
github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM=
|
||||||
github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
|
github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
|
||||||
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
|
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
|
||||||
|
github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw=
|
||||||
|
github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ=
|
||||||
github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk=
|
github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk=
|
||||||
github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
|
github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
|
||||||
|
github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus=
|
||||||
|
github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig=
|
||||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
|
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
|
||||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
|
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
|
||||||
|
github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U=
|
||||||
|
github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
|
||||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
@@ -317,12 +351,16 @@ github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzr
|
|||||||
github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs=
|
github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs=
|
||||||
github.com/golangci/golangci-lint v1.50.1 h1:C829clMcZXEORakZlwpk7M4iDw2XiwxxKaG504SZ9zY=
|
github.com/golangci/golangci-lint v1.50.1 h1:C829clMcZXEORakZlwpk7M4iDw2XiwxxKaG504SZ9zY=
|
||||||
github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w=
|
github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w=
|
||||||
|
github.com/golangci/golangci-lint v1.51.2 h1:yIcsT1X9ZYHdSpeWXRT1ORC/FPGSqDHbHsu9uk4FK7M=
|
||||||
|
github.com/golangci/golangci-lint v1.51.2/go.mod h1:KH9Q7/3glwpYSknxUgUyLlAv46A8fsSKo1hH2wDvkr8=
|
||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA=
|
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA=
|
||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
|
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
|
||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
|
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
|
||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
|
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
|
||||||
github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo=
|
github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo=
|
||||||
github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
|
github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
|
||||||
|
github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0=
|
||||||
|
github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc=
|
||||||
github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ=
|
github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ=
|
||||||
github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs=
|
github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs=
|
||||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
|
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
|
||||||
@@ -388,6 +426,8 @@ github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHP
|
|||||||
github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
|
github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
|
||||||
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U=
|
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U=
|
||||||
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
|
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
|
||||||
|
github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U=
|
||||||
|
github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
|
||||||
github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA=
|
github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA=
|
||||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
@@ -466,6 +506,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:
|
|||||||
github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
|
||||||
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM=
|
github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM=
|
||||||
github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
|
github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
|
||||||
@@ -495,12 +536,16 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
|
|||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
|
github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
|
||||||
github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
|
github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
|
||||||
|
github.com/junk1tm/musttag v0.4.5 h1:d+mpJ1vn6WFEVKHwkgJiIedis1u/EawKOuUTygAUtCo=
|
||||||
|
github.com/junk1tm/musttag v0.4.5/go.mod h1:XkcL/9O6RmD88JBXb+I15nYRl9W4ExhgQeCBEhfMC8U=
|
||||||
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c=
|
github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c=
|
||||||
github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw=
|
github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw=
|
||||||
|
github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8=
|
||||||
|
github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw=
|
||||||
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
|
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/kkHAIKE/contextcheck v1.1.3 h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw=
|
github.com/kkHAIKE/contextcheck v1.1.3 h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw=
|
||||||
@@ -525,12 +570,18 @@ github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1
|
|||||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M=
|
github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M=
|
||||||
github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg=
|
github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg=
|
||||||
|
github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ=
|
||||||
|
github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA=
|
||||||
github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA=
|
github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA=
|
||||||
github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0=
|
github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0=
|
||||||
github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM=
|
github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM=
|
||||||
github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88=
|
github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88=
|
||||||
|
github.com/ldez/tagliatelle v0.4.0 h1:sylp7d9kh6AdXN2DpVGHBRb5guTVAgOxqNGhbqc4b1c=
|
||||||
|
github.com/ldez/tagliatelle v0.4.0/go.mod h1:mNtTfrHy2haaBAw+VT7IBV6VXBThS7TCreYWbBcJ87I=
|
||||||
github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg=
|
github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg=
|
||||||
github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY=
|
github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY=
|
||||||
|
github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU=
|
||||||
|
github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY=
|
||||||
github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag=
|
github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
@@ -569,6 +620,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
|
|||||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
|
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
||||||
|
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
@@ -582,6 +635,8 @@ github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aks
|
|||||||
github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
|
github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
|
||||||
github.com/mgechev/revive v1.2.4 h1:+2Hd/S8oO2H0Ikq2+egtNwQsVhAeELHjxjIUFX5ajLI=
|
github.com/mgechev/revive v1.2.4 h1:+2Hd/S8oO2H0Ikq2+egtNwQsVhAeELHjxjIUFX5ajLI=
|
||||||
github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q=
|
github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q=
|
||||||
|
github.com/mgechev/revive v1.2.5 h1:UF9AR8pOAuwNmhXj2odp4mxv9Nx2qUIwVz8ZsU+Mbec=
|
||||||
|
github.com/mgechev/revive v1.2.5/go.mod h1:nFOXent79jMTISAfOAasKfy0Z2Ejq0WX7Qn/KAdYopI=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
||||||
github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||||
@@ -622,9 +677,13 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJ
|
|||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/nishanths/exhaustive v0.8.3 h1:pw5O09vwg8ZaditDp/nQRqVnrMczSJDxRDJMowvhsrM=
|
github.com/nishanths/exhaustive v0.8.3 h1:pw5O09vwg8ZaditDp/nQRqVnrMczSJDxRDJMowvhsrM=
|
||||||
github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg=
|
github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg=
|
||||||
|
github.com/nishanths/exhaustive v0.9.5 h1:TzssWan6orBiLYVqewCG8faud9qlFntJE30ACpzmGME=
|
||||||
|
github.com/nishanths/exhaustive v0.9.5/go.mod h1:IbwrGdVMizvDcIxPYGVdQn5BqWJaOwpCvg4RGb8r/TA=
|
||||||
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ=
|
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ=
|
||||||
github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=
|
github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk=
|
||||||
github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c=
|
github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c=
|
||||||
|
github.com/nunnatsa/ginkgolinter v0.8.1 h1:/y4o/0hV+ruUHj4xXh89xlFjoaitnI4LnkpuYs02q1c=
|
||||||
|
github.com/nunnatsa/ginkgolinter v0.8.1/go.mod h1:FYYLtszIdmzCH8XMaMPyxPVXZ7VCaIm55bA+gugx+14=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
@@ -674,6 +733,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/polyfloyd/go-errorlint v1.0.5 h1:AHB5JRCjlmelh9RrLxT9sgzpalIwwq4hqE8EkwIwKdY=
|
github.com/polyfloyd/go-errorlint v1.0.5 h1:AHB5JRCjlmelh9RrLxT9sgzpalIwwq4hqE8EkwIwKdY=
|
||||||
github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI=
|
github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI=
|
||||||
|
github.com/polyfloyd/go-errorlint v1.1.0 h1:VKoEFg5yxSgJ2yFPVhxW7oGz+f8/OVcuMeNvcPIi6Eg=
|
||||||
|
github.com/polyfloyd/go-errorlint v1.1.0/go.mod h1:Uss7Bc/izYG0leCMRx3WVlrpqWedSZk7V/FUQW6VJ6U=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||||
@@ -708,12 +769,16 @@ github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3
|
|||||||
github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30=
|
github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30=
|
||||||
github.com/quasilyte/go-ruleguard v0.3.18 h1:sd+abO1PEI9fkYennwzHn9kl3nqP6M5vE7FiOzZ+5CE=
|
github.com/quasilyte/go-ruleguard v0.3.18 h1:sd+abO1PEI9fkYennwzHn9kl3nqP6M5vE7FiOzZ+5CE=
|
||||||
github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs=
|
github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs=
|
||||||
|
github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc=
|
||||||
|
github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw=
|
||||||
github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||||
github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||||
github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc=
|
github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc=
|
||||||
github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50=
|
github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50=
|
||||||
github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f h1:6Gtn2i04RD0gVyYf2/IUMTIs+qYleBt4zxDqkLTcu4U=
|
github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f h1:6Gtn2i04RD0gVyYf2/IUMTIs+qYleBt4zxDqkLTcu4U=
|
||||||
github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng=
|
github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng=
|
||||||
|
github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo=
|
||||||
|
github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng=
|
||||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY=
|
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY=
|
||||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
|
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
|
||||||
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs=
|
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs=
|
||||||
@@ -733,20 +798,30 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
|
|||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1rEOtBp4=
|
github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1rEOtBp4=
|
||||||
github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M=
|
github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M=
|
||||||
|
github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw=
|
||||||
|
github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50=
|
||||||
github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw=
|
github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw=
|
||||||
github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
|
github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
|
||||||
|
github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI=
|
||||||
|
github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ=
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
|
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
|
||||||
github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8=
|
github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8=
|
||||||
github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3335lYTyxRoA=
|
github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3335lYTyxRoA=
|
||||||
github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
|
github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
|
||||||
|
github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc=
|
||||||
|
github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
|
||||||
github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw=
|
github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw=
|
||||||
github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ=
|
github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ=
|
||||||
github.com/sashamelentyev/usestdlibvars v1.20.0 h1:K6CXjqqtSYSsuyRDDC7Sjn6vTMLiSJa4ZmDkiokoqtw=
|
github.com/sashamelentyev/usestdlibvars v1.20.0 h1:K6CXjqqtSYSsuyRDDC7Sjn6vTMLiSJa4ZmDkiokoqtw=
|
||||||
github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg=
|
github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg=
|
||||||
|
github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0=
|
||||||
|
github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU=
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
github.com/securego/gosec/v2 v2.13.1 h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM=
|
github.com/securego/gosec/v2 v2.13.1 h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM=
|
||||||
github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo=
|
github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo=
|
||||||
|
github.com/securego/gosec/v2 v2.15.0 h1:v4Ym7FF58/jlykYmmhZ7mTm7FQvN/setNm++0fgIAtw=
|
||||||
|
github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8=
|
||||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
|
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
|
||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
|
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
|
||||||
@@ -766,11 +841,15 @@ github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt
|
|||||||
github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY=
|
github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY=
|
||||||
github.com/sivchari/tenv v1.7.0 h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE=
|
github.com/sivchari/tenv v1.7.0 h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE=
|
||||||
github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg=
|
github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg=
|
||||||
|
github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak=
|
||||||
|
github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg=
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY=
|
github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY=
|
||||||
github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI=
|
github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI=
|
||||||
github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ=
|
github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ=
|
||||||
github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
|
github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
|
||||||
|
github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=
|
||||||
|
github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
|
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
|
||||||
@@ -786,6 +865,8 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL
|
|||||||
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
|
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
|
||||||
github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI=
|
github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI=
|
||||||
github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||||
|
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||||
|
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||||
@@ -805,6 +886,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
|||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
|
github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
|
||||||
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
@@ -818,11 +901,15 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F
|
|||||||
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
|
github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
|
||||||
github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo=
|
github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo=
|
||||||
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
|
github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs=
|
||||||
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
|
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
|
||||||
|
github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8=
|
||||||
|
github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk=
|
||||||
github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A=
|
github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A=
|
||||||
github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
|
github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
|
||||||
github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
|
github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
|
||||||
@@ -831,6 +918,8 @@ github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw=
|
|||||||
github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8=
|
github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8=
|
||||||
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro=
|
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro=
|
||||||
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
|
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
|
||||||
|
github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo=
|
||||||
|
github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ=
|
||||||
github.com/timonwong/loggercheck v0.9.3 h1:ecACo9fNiHxX4/Bc02rW2+kaJIAMAes7qJ7JKxt0EZI=
|
github.com/timonwong/loggercheck v0.9.3 h1:ecACo9fNiHxX4/Bc02rW2+kaJIAMAes7qJ7JKxt0EZI=
|
||||||
github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw=
|
github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw=
|
||||||
github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
|
github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
|
||||||
@@ -840,6 +929,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
|
|||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/tomarrell/wrapcheck/v2 v2.7.0 h1:J/F8DbSKJC83bAvC6FoZaRjZiZ/iKoueSdrEkmGeacA=
|
github.com/tomarrell/wrapcheck/v2 v2.7.0 h1:J/F8DbSKJC83bAvC6FoZaRjZiZ/iKoueSdrEkmGeacA=
|
||||||
github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg=
|
github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg=
|
||||||
|
github.com/tomarrell/wrapcheck/v2 v2.8.0 h1:qDzbir0xmoE+aNxGCPrn+rUSxAX+nG6vREgbbXAR81I=
|
||||||
|
github.com/tomarrell/wrapcheck/v2 v2.8.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg=
|
||||||
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
|
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
|
||||||
github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
|
github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
|
||||||
github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
|
github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
|
||||||
@@ -951,6 +1042,8 @@ golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl
|
|||||||
golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||||
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 h1:Ic/qN6TEifvObMGQy72k0n1LlJr7DjWWEi+MOsDOiSk=
|
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 h1:Ic/qN6TEifvObMGQy72k0n1LlJr7DjWWEi+MOsDOiSk=
|
||||||
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||||
|
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 h1:6WHiuFL9FNjg8RljAaT7FNUuKDbvMqS1i5cr2OE2sLQ=
|
||||||
|
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
@@ -982,6 +1075,9 @@ golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2
|
|||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
|
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
|
||||||
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
|
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
|
||||||
|
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
|
||||||
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -1044,6 +1140,9 @@ golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su
|
|||||||
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||||
|
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
||||||
|
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||||
|
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@@ -1080,6 +1179,8 @@ golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc=
|
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc=
|
||||||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||||
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -1192,10 +1293,18 @@ golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
|
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
||||||
|
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||||
|
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -1209,6 +1318,9 @@ golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
|
|||||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
|
||||||
|
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@@ -1318,6 +1430,11 @@ golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clI
|
|||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
|
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
|
||||||
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
||||||
|
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
|
||||||
|
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
|
||||||
|
golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
|
||||||
|
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
|
||||||
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@@ -1553,6 +1670,8 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
|
|||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
honnef.co/go/tools v0.3.3 h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA=
|
honnef.co/go/tools v0.3.3 h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA=
|
||||||
honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw=
|
honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw=
|
||||||
|
honnef.co/go/tools v0.4.2 h1:6qXr+R5w+ktL5UkwEbPp+fEvfyoMPche6GkOpGHZcLc=
|
||||||
|
honnef.co/go/tools v0.4.2/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA=
|
||||||
mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM=
|
mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM=
|
||||||
mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ=
|
mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ=
|
||||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
|
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
|
||||||
@@ -1561,6 +1680,8 @@ mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphD
|
|||||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
|
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
|
||||||
mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 h1:seuXWbRB1qPrS3NQnHmFKLJLtskWyueeIzmLXghMGgk=
|
mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 h1:seuXWbRB1qPrS3NQnHmFKLJLtskWyueeIzmLXghMGgk=
|
||||||
mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk=
|
mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk=
|
||||||
|
mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w=
|
||||||
|
mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is=
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.7. DO NOT EDIT.
|
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT.
|
||||||
# All tools are designed to be build inside $GOBIN.
|
# All tools are designed to be build inside $GOBIN.
|
||||||
# Those variables will work only until 'bingo get' was invoked, or if tools were installed via Makefile's Variables.mk.
|
# Those variables will work only until 'bingo get' was invoked, or if tools were installed via Makefile's Variables.mk.
|
||||||
GOBIN=${GOBIN:=$(go env GOBIN)}
|
GOBIN=${GOBIN:=$(go env GOBIN)}
|
||||||
@@ -14,7 +14,7 @@ CUE="${GOBIN}/cue-v0.5.0-beta.2"
|
|||||||
|
|
||||||
DRONE="${GOBIN}/drone-v1.5.0"
|
DRONE="${GOBIN}/drone-v1.5.0"
|
||||||
|
|
||||||
GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.50.1"
|
GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.51.2"
|
||||||
|
|
||||||
JB="${GOBIN}/jb-v0.5.1"
|
JB="${GOBIN}/jb-v0.5.1"
|
||||||
|
|
||||||
|
|||||||
42
.drone.star
42
.drone.star
@@ -11,21 +11,28 @@ load("scripts/drone/events/pr.star", "pr_pipelines")
|
|||||||
load("scripts/drone/events/main.star", "main_pipelines")
|
load("scripts/drone/events/main.star", "main_pipelines")
|
||||||
load(
|
load(
|
||||||
"scripts/drone/events/release.star",
|
"scripts/drone/events/release.star",
|
||||||
"artifacts_page_pipeline",
|
"integration_test_pipelines",
|
||||||
"enterprise2_pipelines",
|
|
||||||
"enterprise_pipelines",
|
|
||||||
"oss_pipelines",
|
|
||||||
"publish_artifacts_pipelines",
|
"publish_artifacts_pipelines",
|
||||||
"publish_npm_pipelines",
|
"publish_npm_pipelines",
|
||||||
"publish_packages_pipeline",
|
"publish_packages_pipeline",
|
||||||
)
|
)
|
||||||
|
load(
|
||||||
|
"scripts/drone/rgm.star",
|
||||||
|
"rgm",
|
||||||
|
)
|
||||||
load(
|
load(
|
||||||
"scripts/drone/pipelines/publish_images.star",
|
"scripts/drone/pipelines/publish_images.star",
|
||||||
"publish_image_pipelines_public",
|
"publish_image_pipelines_public",
|
||||||
"publish_image_pipelines_security",
|
|
||||||
)
|
)
|
||||||
load("scripts/drone/pipelines/github.star", "publish_github_pipeline")
|
load(
|
||||||
load("scripts/drone/pipelines/aws_marketplace.star", "publish_aws_marketplace_pipeline")
|
"scripts/drone/pipelines/ci_images.star",
|
||||||
|
"publish_ci_build_container_image_pipeline",
|
||||||
|
"publish_ci_windows_test_image_pipeline",
|
||||||
|
)
|
||||||
|
load(
|
||||||
|
"scripts/drone/pipelines/windows.star",
|
||||||
|
"windows_test_backend",
|
||||||
|
)
|
||||||
load("scripts/drone/version.star", "version_branch_pipelines")
|
load("scripts/drone/version.star", "version_branch_pipelines")
|
||||||
load("scripts/drone/events/cron.star", "cronjobs")
|
load("scripts/drone/events/cron.star", "cronjobs")
|
||||||
load("scripts/drone/vault.star", "secrets")
|
load("scripts/drone/vault.star", "secrets")
|
||||||
@@ -34,24 +41,19 @@ def main(_ctx):
|
|||||||
return (
|
return (
|
||||||
pr_pipelines() +
|
pr_pipelines() +
|
||||||
main_pipelines() +
|
main_pipelines() +
|
||||||
oss_pipelines() +
|
|
||||||
enterprise_pipelines() +
|
|
||||||
enterprise2_pipelines() +
|
|
||||||
enterprise2_pipelines(
|
|
||||||
prefix = "custom-",
|
|
||||||
trigger = {"event": ["custom"]},
|
|
||||||
) +
|
|
||||||
publish_image_pipelines_public() +
|
publish_image_pipelines_public() +
|
||||||
publish_image_pipelines_security() +
|
|
||||||
publish_github_pipeline("public") +
|
|
||||||
publish_github_pipeline("security") +
|
|
||||||
publish_aws_marketplace_pipeline("public") +
|
|
||||||
publish_artifacts_pipelines("security") +
|
|
||||||
publish_artifacts_pipelines("public") +
|
publish_artifacts_pipelines("public") +
|
||||||
publish_npm_pipelines() +
|
publish_npm_pipelines() +
|
||||||
publish_packages_pipeline() +
|
publish_packages_pipeline() +
|
||||||
artifacts_page_pipeline() +
|
rgm() +
|
||||||
|
[windows_test_backend({
|
||||||
|
"event": ["promote"],
|
||||||
|
"target": ["test-windows"],
|
||||||
|
}, "oss", "testing")] +
|
||||||
version_branch_pipelines() +
|
version_branch_pipelines() +
|
||||||
|
integration_test_pipelines() +
|
||||||
|
publish_ci_windows_test_image_pipeline() +
|
||||||
|
publish_ci_build_container_image_pipeline() +
|
||||||
cronjobs() +
|
cronjobs() +
|
||||||
secrets()
|
secrets()
|
||||||
)
|
)
|
||||||
|
|||||||
4726
.drone.yml
4726
.drone.yml
File diff suppressed because it is too large
Load Diff
90
.github/CODEOWNERS
vendored
90
.github/CODEOWNERS
vendored
@@ -34,19 +34,25 @@ SUPPORT.md @torkelo
|
|||||||
UPGRADING_DEPENDENCIES.md @grafana/docs-grafana
|
UPGRADING_DEPENDENCIES.md @grafana/docs-grafana
|
||||||
WORKFLOW.md @torkelo
|
WORKFLOW.md @torkelo
|
||||||
|
|
||||||
|
# Technical documentation
|
||||||
# Set up, dashboards/visualization, best practices: Chris Moyer
|
/docs/ @Eve832 @jdbaldry
|
||||||
# Alerting: Brenda Muir
|
/docs/sources/ @Eve832
|
||||||
/docs/sources/administration/ @Eve832 @GrafanaWriter
|
/docs/sources/administration/ @Eve832 @GrafanaWriter
|
||||||
/docs/sources/alerting/ @brendamuir
|
/docs/sources/alerting/ @brendamuir
|
||||||
/docs/sources/dashboards/ @chri2547
|
/docs/sources/dashboards/ @imatwawana
|
||||||
/docs/sources/datasources/ @Eve832 @GrafanaWriter
|
/docs/sources/datasources/ @Eve832 @GrafanaWriter
|
||||||
/docs/sources/explore/ @Eve832 @GrafanaWriter
|
/docs/sources/explore/ @Eve832 @GrafanaWriter
|
||||||
/docs/sources/getting-started/ @chri2547
|
/docs/sources/fundamentals @chri2547
|
||||||
/docs/sources/old-alerting/ @brendamuir
|
/docs/sources/getting-started/ @chri2547
|
||||||
/docs/sources/release-notes/ @Eve832 @GrafanaWriter
|
/docs/sources/introduction/ @chri2547
|
||||||
/docs/sources/setup-grafana/ @chri2547
|
/docs/sources/old-alerting/ @brendamuir
|
||||||
/docs/sources/whatsnew/ @Eve832 @GrafanaWriter
|
/docs/sources/panels-visualizations/ @imatwawana
|
||||||
|
/docs/sources/release-notes/ @Eve832 @GrafanaWriter
|
||||||
|
/docs/sources/setup-grafana/ @chri2547
|
||||||
|
/docs/sources/upgrade-guide/ @chri2547 @imatwawana
|
||||||
|
/docs/sources/whatsnew/ @chri2547 @imatwawana
|
||||||
|
/docs/sources/developers/plugins/ @Eve832 @josmperez @grafana/plugins-platform-frontend @grafana/plugins-platform-backend
|
||||||
|
/docs/sources/developers/plugins/backend/ @Eve832 @grafana/plugins-platform-backend
|
||||||
|
|
||||||
# Backend code
|
# Backend code
|
||||||
/go.mod @grafana/backend-platform
|
/go.mod @grafana/backend-platform
|
||||||
@@ -133,6 +139,7 @@ WORKFLOW.md @torkelo
|
|||||||
/pkg/services/validations/ @grafana/backend-platform
|
/pkg/services/validations/ @grafana/backend-platform
|
||||||
/pkg/setting/ @grafana/backend-platform
|
/pkg/setting/ @grafana/backend-platform
|
||||||
/pkg/tests/ @grafana/backend-platform
|
/pkg/tests/ @grafana/backend-platform
|
||||||
|
/pkg/tests/api/correlations/ @grafana/explore-squad
|
||||||
/pkg/tsdb/grafanads/ @grafana/backend-platform
|
/pkg/tsdb/grafanads/ @grafana/backend-platform
|
||||||
/pkg/tsdb/intervalv2/ @grafana/backend-platform
|
/pkg/tsdb/intervalv2/ @grafana/backend-platform
|
||||||
/pkg/tsdb/legacydata/ @grafana/backend-platform
|
/pkg/tsdb/legacydata/ @grafana/backend-platform
|
||||||
@@ -219,14 +226,15 @@ WORKFLOW.md @torkelo
|
|||||||
|
|
||||||
|
|
||||||
# Continuous Integration
|
# Continuous Integration
|
||||||
.drone.yml @grafana/grafana-release-eng
|
.drone.yml @grafana/grafana-delivery
|
||||||
.drone.star @grafana/grafana-release-eng
|
.drone.star @grafana/grafana-delivery
|
||||||
/scripts/drone/ @grafana/grafana-release-eng
|
/scripts/drone/ @grafana/grafana-delivery
|
||||||
/pkg/build/ @grafana/grafana-release-eng
|
/pkg/build/ @grafana/grafana-delivery
|
||||||
/.dockerignore @grafana/grafana-release-eng
|
/.dockerignore @grafana/grafana-delivery
|
||||||
/Dockerfile @grafana/grafana-release-eng
|
/Dockerfile @grafana/grafana-delivery
|
||||||
/Makefile @grafana/grafana-release-eng
|
/Makefile @grafana/grafana-delivery
|
||||||
/scripts/build/ @grafana/grafana-release-eng
|
/scripts/build/ @grafana/grafana-delivery
|
||||||
|
/scripts/list-release-artifacts.sh @grafana/grafana-delivery
|
||||||
|
|
||||||
# OSS Plugin Partnerships backend code
|
# OSS Plugin Partnerships backend code
|
||||||
/pkg/tsdb/cloudwatch/ @grafana/aws-plugins
|
/pkg/tsdb/cloudwatch/ @grafana/aws-plugins
|
||||||
@@ -452,25 +460,25 @@ lerna.json @grafana/frontend-ops
|
|||||||
|
|
||||||
/scripts/benchmark-access-control.sh @grafana/grafana-authnz-team
|
/scripts/benchmark-access-control.sh @grafana/grafana-authnz-team
|
||||||
/scripts/check-breaking-changes.sh @grafana/plugins-platform-frontend
|
/scripts/check-breaking-changes.sh @grafana/plugins-platform-frontend
|
||||||
/scripts/ci-* @grafana/grafana-release-eng
|
/scripts/ci-* @grafana/grafana-delivery
|
||||||
/scripts/circle-* @grafana/grafana-release-eng
|
/scripts/circle-* @grafana/grafana-delivery
|
||||||
/scripts/ci-frontend-metrics.sh @grafana/user-essentials @grafana/plugins-platform-frontend @grafana/grafana-bi-squad
|
/scripts/ci-frontend-metrics.sh @grafana/user-essentials @grafana/plugins-platform-frontend @grafana/grafana-bi-squad
|
||||||
/scripts/cli/ @grafana/user-essentials
|
/scripts/cli/ @grafana/user-essentials
|
||||||
/scripts/clean-git-or-error.sh @grafana/grafana-as-code
|
/scripts/clean-git-or-error.sh @grafana/grafana-as-code
|
||||||
/scripts/grafana-server/ @grafana/user-essentials
|
/scripts/grafana-server/ @grafana/user-essentials
|
||||||
/scripts/helpers/ @grafana/grafana-release-eng
|
/scripts/helpers/ @grafana/grafana-delivery
|
||||||
/scripts/import_many_dashboards.sh @torkelo
|
/scripts/import_many_dashboards.sh @torkelo
|
||||||
/scripts/mixin-check.sh @bergquist
|
/scripts/mixin-check.sh @bergquist
|
||||||
/scripts/openapi3/ @grafana/grafana-partnerships-team
|
/scripts/openapi3/ @grafana/grafana-partnerships-team
|
||||||
/scripts/prepare-packagejson.js @grafana/frontend-ops
|
/scripts/prepare-packagejson.js @grafana/frontend-ops
|
||||||
/scripts/protobuf-check.sh @grafana/plugins-platform-backend
|
/scripts/protobuf-check.sh @grafana/plugins-platform-backend
|
||||||
/scripts/stripnulls.sh @grafana/grafana-as-code
|
/scripts/stripnulls.sh @grafana/grafana-as-code
|
||||||
/scripts/tag_release.sh @grafana/grafana-release-eng
|
/scripts/tag_release.sh @grafana/grafana-delivery
|
||||||
/scripts/trigger_docker_build.sh @grafana/grafana-release-eng
|
/scripts/trigger_docker_build.sh @grafana/grafana-delivery
|
||||||
/scripts/trigger_grafana_packer.sh @grafana/grafana-release-eng
|
/scripts/trigger_grafana_packer.sh @grafana/grafana-delivery
|
||||||
/scripts/trigger_windows_build.sh @grafana/grafana-release-eng
|
/scripts/trigger_windows_build.sh @grafana/grafana-delivery
|
||||||
/scripts/validate-devenv-dashboards.sh @grafana/grafana-release-eng
|
/scripts/validate-devenv-dashboards.sh @grafana/grafana-delivery
|
||||||
/scripts/verify-repo-update/ @grafana/grafana-release-eng
|
/scripts/verify-repo-update/ @grafana/grafana-delivery
|
||||||
|
|
||||||
/scripts/webpack/ @grafana/frontend-ops
|
/scripts/webpack/ @grafana/frontend-ops
|
||||||
/scripts/generate-a11y-report.sh @grafana/user-essentials
|
/scripts/generate-a11y-report.sh @grafana/user-essentials
|
||||||
@@ -518,18 +526,19 @@ lerna.json @grafana/frontend-ops
|
|||||||
# Grafana authentication and authorization
|
# Grafana authentication and authorization
|
||||||
/pkg/login/ @grafana/grafana-authnz-team
|
/pkg/login/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/accesscontrol/ @grafana/grafana-authnz-team
|
/pkg/services/accesscontrol/ @grafana/grafana-authnz-team
|
||||||
|
/pkg/services/anonymous/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/auth/ @grafana/grafana-authnz-team
|
/pkg/services/auth/ @grafana/grafana-authnz-team
|
||||||
|
/pkg/services/authn/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/dashboards/accesscontrol.go @grafana/grafana-authnz-team
|
/pkg/services/dashboards/accesscontrol.go @grafana/grafana-authnz-team
|
||||||
/pkg/services/datasources/permissions/ @grafana/grafana-authnz-team
|
/pkg/services/datasources/permissions/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/guardian/ @grafana/grafana-authnz-team
|
/pkg/services/guardian/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/ldap/ @grafana/grafana-authnz-team
|
/pkg/services/ldap/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/login/ @grafana/grafana-authnz-team
|
/pkg/services/login/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/multildap/ @grafana/grafana-authnz-team
|
/pkg/services/multildap/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/oauthtoken/ @grafana/grafana-authnz-team
|
|
||||||
/pkg/services/teamguardian/ @grafana/grafana-authnz-team
|
|
||||||
/pkg/services/serviceaccounts/ @grafana/grafana-authnz-team
|
|
||||||
/pkg/services/loginattempt/ @grafana/grafana-authnz-team
|
/pkg/services/loginattempt/ @grafana/grafana-authnz-team
|
||||||
/pkg/services/authn/ @grafana/grafana-authnz-team
|
/pkg/services/oauthtoken/ @grafana/grafana-authnz-team
|
||||||
|
/pkg/services/serviceaccounts/ @grafana/grafana-authnz-team
|
||||||
|
/pkg/services/teamguardian/ @grafana/grafana-authnz-team
|
||||||
|
|
||||||
# Support bundles
|
# Support bundles
|
||||||
/public/app/features/support-bundles/ @grafana/grafana-authnz-team
|
/public/app/features/support-bundles/ @grafana/grafana-authnz-team
|
||||||
@@ -568,9 +577,10 @@ embed.go @grafana/grafana-as-code
|
|||||||
/.github/pr-commands.json @marefr
|
/.github/pr-commands.json @marefr
|
||||||
/.github/renovate.json5 @grafana/frontend-ops
|
/.github/renovate.json5 @grafana/frontend-ops
|
||||||
/.github/teams.yml @armandgrillet
|
/.github/teams.yml @armandgrillet
|
||||||
/.github/workflows/backport.yml @grafana/grafana-release-eng
|
/.github/workflows/auto-milestone.yml @grafana/grafana-delivery
|
||||||
/.github/workflows/bump-version.yml @grafana/grafana-release-eng
|
/.github/workflows/backport.yml @grafana/grafana-delivery
|
||||||
/.github/workflows/close-milestone.yml @grafana/grafana-release-eng
|
/.github/workflows/bump-version.yml @grafana/grafana-delivery
|
||||||
|
/.github/workflows/close-milestone.yml @grafana/grafana-delivery
|
||||||
/.github/workflows/cloud-data-sources-code-coverage.yml @grafana/partner-plugins @grafana/aws-plugins
|
/.github/workflows/cloud-data-sources-code-coverage.yml @grafana/partner-plugins @grafana/aws-plugins
|
||||||
/.github/workflows/codeowners-validator.yml @tolzhabayev
|
/.github/workflows/codeowners-validator.yml @tolzhabayev
|
||||||
/.github/workflows/codeql-analysis.yml @DanCech
|
/.github/workflows/codeql-analysis.yml @DanCech
|
||||||
@@ -590,6 +600,8 @@ embed.go @grafana/grafana-as-code
|
|||||||
/.github/workflows/pr-codeql-analysis-python.yml @DanCech
|
/.github/workflows/pr-codeql-analysis-python.yml @DanCech
|
||||||
/.github/workflows/pr-commands-closed.yml @tolzhabayev
|
/.github/workflows/pr-commands-closed.yml @tolzhabayev
|
||||||
/.github/workflows/pr-commands.yml @marefr
|
/.github/workflows/pr-commands.yml @marefr
|
||||||
|
/.github/workflows/pr-patch-check.yml @grafana/grafana-delivery
|
||||||
|
/.github/workflows/sync-mirror.yml @grafana/grafana-delivery
|
||||||
/.github/workflows/publish-technical-documentation-next.yml @grafana/docs-grafana
|
/.github/workflows/publish-technical-documentation-next.yml @grafana/docs-grafana
|
||||||
/.github/workflows/publish-technical-documentation-release.yml @grafana/docs-grafana
|
/.github/workflows/publish-technical-documentation-release.yml @grafana/docs-grafana
|
||||||
/.github/workflows/remove-milestone.yml @grafana/user-essentials
|
/.github/workflows/remove-milestone.yml @grafana/user-essentials
|
||||||
@@ -597,8 +609,8 @@ embed.go @grafana/grafana-as-code
|
|||||||
/.github/workflows/scripts/json-file-to-job-output.js @grafana/plugins-platform-frontend
|
/.github/workflows/scripts/json-file-to-job-output.js @grafana/plugins-platform-frontend
|
||||||
/.github/workflows/scripts/pr-get-job-link.js @grafana/plugins-platform-frontend
|
/.github/workflows/scripts/pr-get-job-link.js @grafana/plugins-platform-frontend
|
||||||
/.github/workflows/stale.yml @grafana/user-essentials
|
/.github/workflows/stale.yml @grafana/user-essentials
|
||||||
/.github/workflows/update-changelog.yml @grafana/grafana-release-eng
|
/.github/workflows/update-changelog.yml @grafana/grafana-delivery
|
||||||
|
/.github/workflows/snyk.yml @grafana/security-team
|
||||||
|
|
||||||
# Conf
|
# Conf
|
||||||
/conf/defaults.ini @torkelo
|
/conf/defaults.ini @torkelo
|
||||||
|
|||||||
24
.github/workflows/auto-milestone.yml
vendored
Normal file
24
.github/workflows/auto-milestone.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: Auto-milestone
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- reopened
|
||||||
|
- closed
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
|
|
||||||
|
- name: Run auto-milestone
|
||||||
|
uses: grafana/grafana-github-actions-go/auto-milestone@main
|
||||||
|
with:
|
||||||
|
pr: ${{ github.event.pull_request.number }}
|
||||||
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
8
.github/workflows/backport.yml
vendored
8
.github/workflows/backport.yml
vendored
@@ -17,10 +17,16 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
- name: Install Actions
|
- name: Install Actions
|
||||||
run: npm install --production --prefix ./actions
|
run: npm install --production --prefix ./actions
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
- name: Run backport
|
- name: Run backport
|
||||||
uses: ./actions/backport
|
uses: ./actions/backport
|
||||||
with:
|
with:
|
||||||
metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}}
|
metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}}
|
||||||
token: ${{secrets.GH_BOT_ACCESS_TOKEN}}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
labelsToAdd: "backport,no-changelog"
|
labelsToAdd: "backport,no-changelog"
|
||||||
title: "[{{base}}] {{originalTitle}}"
|
title: "[{{base}}] {{originalTitle}}"
|
||||||
|
|||||||
12
.github/workflows/bump-version.yml
vendored
12
.github/workflows/bump-version.yml
vendored
@@ -6,12 +6,12 @@ on:
|
|||||||
description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch or major.minor.patch-beta<number> format. example: 7.4.3 or 7.4.3-beta1'
|
description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch or major.minor.patch-beta<number> format. example: 7.4.3 or 7.4.3-beta1'
|
||||||
required: true
|
required: true
|
||||||
env:
|
env:
|
||||||
YARN_ENABLE_IMMUTABLE_INSTALLS: false
|
YARN_ENABLE_IMMUTABLE_INSTALLS: false
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
# This is a basic workflow to help you get started with Actions
|
# This is a basic workflow to help you get started with Actions
|
||||||
- uses: actions-ecosystem/action-regex-match@v2.0.2
|
- uses: actions-ecosystem/action-regex-match@v2.0.2
|
||||||
if: ${{ github.event.inputs.version != '' }}
|
if: ${{ github.event.inputs.version != '' }}
|
||||||
id: regex-match
|
id: regex-match
|
||||||
@@ -68,8 +68,14 @@ jobs:
|
|||||||
node-version: '16'
|
node-version: '16'
|
||||||
- name: Install Actions
|
- name: Install Actions
|
||||||
run: npm install --production --prefix ./actions
|
run: npm install --production --prefix ./actions
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
- name: Run bump version (manually invoked)
|
- name: Run bump version (manually invoked)
|
||||||
uses: ./actions/bump-version
|
uses: ./actions/bump-version
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||||
|
|||||||
14
.github/workflows/close-milestone.yml
vendored
14
.github/workflows/close-milestone.yml
vendored
@@ -11,9 +11,7 @@ on:
|
|||||||
description: Needs to match, exactly, the name of a milestone
|
description: Needs to match, exactly, the name of a milestone
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
secrets:
|
|
||||||
token:
|
|
||||||
required: true
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -26,14 +24,20 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
- name: Install Actions
|
- name: Install Actions
|
||||||
run: npm install --production --prefix ./actions
|
run: npm install --production --prefix ./actions
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
- name: Close milestone (manually invoked)
|
- name: Close milestone (manually invoked)
|
||||||
if: ${{ github.event.inputs.version != '' }}
|
if: ${{ github.event.inputs.version != '' }}
|
||||||
uses: ./actions/close-milestone
|
uses: ./actions/close-milestone
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
- name: Close milestone (workflow invoked)
|
- name: Close milestone (workflow invoked)
|
||||||
if: ${{ inputs.version_call != '' }}
|
if: ${{ inputs.version_call != '' }}
|
||||||
uses: ./actions/close-milestone
|
uses: ./actions/close-milestone
|
||||||
with:
|
with:
|
||||||
version_call: ${{ inputs.version_call }}
|
version_call: ${{ inputs.version_call }}
|
||||||
token: ${{ secrets.token }}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
workflow-call:
|
workflow-call:
|
||||||
uses: grafana/code-coverage/.github/workflows/code-coverage.yml@v0.1.17
|
uses: grafana/code-coverage/.github/workflows/code-coverage.yml@v0.1.18
|
||||||
with:
|
with:
|
||||||
frontend-path-regexp: public\/app\/plugins\/datasource\/(grafana-azure-monitor-datasource|cloud-monitoring|cloudwatch)
|
frontend-path-regexp: public\/app\/plugins\/datasource\/(grafana-azure-monitor-datasource|cloud-monitoring|cloudwatch)
|
||||||
backend-path-regexp: pkg\/tsdb\/(azuremonitor|cloudmonitoring|cloudwatch)
|
backend-path-regexp: pkg\/tsdb\/(azuremonitor|cloudmonitoring|cloudwatch)
|
||||||
|
|||||||
2
.github/workflows/codeql-analysis.yml
vendored
2
.github/workflows/codeql-analysis.yml
vendored
@@ -44,7 +44,7 @@ jobs:
|
|||||||
name: Set go version
|
name: Set go version
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.19.2'
|
go-version: '1.20.10'
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
|
|||||||
8
.github/workflows/github-release.yml
vendored
8
.github/workflows/github-release.yml
vendored
@@ -17,8 +17,14 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
- name: Install Actions
|
- name: Install Actions
|
||||||
run: npm install --production --prefix ./actions
|
run: npm install --production --prefix ./actions
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
- name: Run github release action
|
- name: Run github release action
|
||||||
uses: ./actions/github-release
|
uses: ./actions/github-release
|
||||||
with:
|
with:
|
||||||
token: ${{secrets.GH_BOT_ACCESS_TOKEN}}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}}
|
metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}}
|
||||||
|
|||||||
6
.github/workflows/milestone.yml
vendored
6
.github/workflows/milestone.yml
vendored
@@ -10,12 +10,10 @@ jobs:
|
|||||||
uses: grafana/grafana/.github/workflows/remove-milestone.yml@main
|
uses: grafana/grafana/.github/workflows/remove-milestone.yml@main
|
||||||
with:
|
with:
|
||||||
version_call: ${{ github.event.inputs.version_input }}
|
version_call: ${{ github.event.inputs.version_input }}
|
||||||
secrets:
|
secrets: inherit
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
|
||||||
call-close-milestone:
|
call-close-milestone:
|
||||||
uses: grafana/grafana/.github/workflows/close-milestone.yml@main
|
uses: grafana/grafana/.github/workflows/close-milestone.yml@main
|
||||||
with:
|
with:
|
||||||
version_call: ${{ github.event.inputs.version_input }}
|
version_call: ${{ github.event.inputs.version_input }}
|
||||||
secrets:
|
secrets: inherit
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
|
||||||
needs: call-remove-milestone
|
needs: call-remove-milestone
|
||||||
2
.github/workflows/ox-code-coverage.yml
vendored
2
.github/workflows/ox-code-coverage.yml
vendored
@@ -15,7 +15,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
workflow-call:
|
workflow-call:
|
||||||
uses: grafana/code-coverage/.github/workflows/code-coverage.yml@v0.1.17
|
uses: grafana/code-coverage/.github/workflows/code-coverage.yml@v0.1.18
|
||||||
with:
|
with:
|
||||||
frontend-path-regexp: public\/app\/features\/(explore|correlations)|public\/app\/plugins\/datasource\/(loki|elasticsearch)
|
frontend-path-regexp: public\/app\/features\/(explore|correlations)|public\/app\/plugins\/datasource\/(loki|elasticsearch)
|
||||||
backend-path-regexp: pkg\/services\/(queryhistory)|pkg\/tsdb\/(loki|elasticsearch)
|
backend-path-regexp: pkg\/services\/(queryhistory)|pkg\/tsdb\/(loki|elasticsearch)
|
||||||
|
|||||||
2
.github/workflows/pr-codeql-analysis-go.yml
vendored
2
.github/workflows/pr-codeql-analysis-go.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
- name: Set go version
|
- name: Set go version
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.19.2'
|
go-version: '1.20.10'
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
|
|||||||
24
.github/workflows/pr-patch-check.yml
vendored
Normal file
24
.github/workflows/pr-patch-check.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Owned by grafana-delivery-squad
|
||||||
|
# Intended to be dropped into the base repo Ex: grafana/grafana
|
||||||
|
name: Check for patch conflicts
|
||||||
|
run-name: check-patch-conflicts-${{ github.base_ref }}-${{ github.head_ref }}
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
branches:
|
||||||
|
- "main"
|
||||||
|
- "v*.*.*"
|
||||||
|
- "release-*"
|
||||||
|
|
||||||
|
# Since this is run on a pull request, we want to apply the patches intended for the
|
||||||
|
# target branch onto the source branch, to verify compatibility before merging.
|
||||||
|
jobs:
|
||||||
|
trigger_downstream_patch_check:
|
||||||
|
uses: grafana/security-patch-actions/.github/workflows/test-patches.yml@main
|
||||||
|
with:
|
||||||
|
src_repo: "${{ github.repository }}"
|
||||||
|
src_ref: "${{ github.head_ref }}" # this is the source branch name, Ex: "feature/newthing"
|
||||||
|
patch_repo: "${{ github.repository }}-security-patches"
|
||||||
|
patch_ref: "${{ github.base_ref }}" # this is the target branch name, Ex: "main"
|
||||||
|
secrets: inherit
|
||||||
@@ -16,9 +16,11 @@ jobs:
|
|||||||
uses: "actions/checkout@v3"
|
uses: "actions/checkout@v3"
|
||||||
|
|
||||||
- name: "Clone website-sync Action"
|
- name: "Clone website-sync Action"
|
||||||
# WEBSITE_SYNC_GRAFANA is a fine-grained GitHub Personal Access Token that expires.
|
# WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires.
|
||||||
# It must be updated in the grafanabot GitHub account.
|
# It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
|
||||||
run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_GRAFANA }}@github.com/grafana/website-sync ./.github/actions/website-sync"
|
# GitHub administrator to update the organization secret.
|
||||||
|
# The IT helpdesk can update the organization secret.
|
||||||
|
run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync"
|
||||||
|
|
||||||
- name: "Publish to website repository (next)"
|
- name: "Publish to website repository (next)"
|
||||||
uses: "./.github/actions/website-sync"
|
uses: "./.github/actions/website-sync"
|
||||||
@@ -27,8 +29,10 @@ jobs:
|
|||||||
repository: "grafana/website"
|
repository: "grafana/website"
|
||||||
branch: "master"
|
branch: "master"
|
||||||
host: "github.com"
|
host: "github.com"
|
||||||
# PUBLISH_TO_WEBSITE_GRAFANA is a fine-grained GitHub Personal Access Token that expires.
|
# PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires.
|
||||||
# It must be updated in the grafanabot GitHub account.
|
# It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
|
||||||
github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_GRAFANA }}"
|
# GitHub administrator to update the organization secret.
|
||||||
|
# The IT helpdesk can update the organization secret.
|
||||||
|
github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}"
|
||||||
source_folder: "docs/sources"
|
source_folder: "docs/sources"
|
||||||
target_folder: "content/docs/grafana/next"
|
target_folder: "content/docs/grafana/next"
|
||||||
|
|||||||
@@ -45,9 +45,11 @@ jobs:
|
|||||||
|
|
||||||
- name: "Clone website-sync Action"
|
- name: "Clone website-sync Action"
|
||||||
if: "steps.has-matching-release-tag.outputs.bool == 'true'"
|
if: "steps.has-matching-release-tag.outputs.bool == 'true'"
|
||||||
# WEBSITE_SYNC_GRAFANA is a fine-grained GitHub Personal Access Token that expires.
|
# WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires.
|
||||||
# It must be updated in the grafanabot GitHub account.
|
# It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
|
||||||
run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_GRAFANA }}@github.com/grafana/website-sync ./.github/actions/website-sync"
|
# GitHub administrator to update the organization secret.
|
||||||
|
# The IT helpdesk can update the organization secret.
|
||||||
|
run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync"
|
||||||
|
|
||||||
- name: "Publish to website repository (release)"
|
- name: "Publish to website repository (release)"
|
||||||
if: "steps.has-matching-release-tag.outputs.bool == 'true'"
|
if: "steps.has-matching-release-tag.outputs.bool == 'true'"
|
||||||
@@ -57,8 +59,10 @@ jobs:
|
|||||||
repository: "grafana/website"
|
repository: "grafana/website"
|
||||||
branch: "master"
|
branch: "master"
|
||||||
host: "github.com"
|
host: "github.com"
|
||||||
# PUBLISH_TO_WEBSITE_GRAFANA is a fine-grained GitHub Personal Access Token that expires.
|
# PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires.
|
||||||
# It must be updated in the grafanabot GitHub account.
|
# It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
|
||||||
github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_GRAFANA }}"
|
# GitHub administrator to update the organization secret.
|
||||||
|
# The IT helpdesk can update the organization secret.
|
||||||
|
github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}"
|
||||||
source_folder: "docs/sources"
|
source_folder: "docs/sources"
|
||||||
target_folder: "content/docs/grafana/${{ steps.target.outputs.target }}"
|
target_folder: "content/docs/grafana/${{ steps.target.outputs.target }}"
|
||||||
|
|||||||
14
.github/workflows/remove-milestone.yml
vendored
14
.github/workflows/remove-milestone.yml
vendored
@@ -11,9 +11,7 @@ on:
|
|||||||
description: Needs to match, exactly, the name of a milestone
|
description: Needs to match, exactly, the name of a milestone
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
secrets:
|
|
||||||
token:
|
|
||||||
required: true
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -26,14 +24,20 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
- name: Install Actions
|
- name: Install Actions
|
||||||
run: npm install --production --prefix ./actions
|
run: npm install --production --prefix ./actions
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
- name: Remove milestone from open issues (manually invoked)
|
- name: Remove milestone from open issues (manually invoked)
|
||||||
if: ${{ github.event.inputs.version != '' }}
|
if: ${{ github.event.inputs.version != '' }}
|
||||||
uses: ./actions/remove-milestone
|
uses: ./actions/remove-milestone
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
- name: Remove milestone from open issues (workflow invoked)
|
- name: Remove milestone from open issues (workflow invoked)
|
||||||
if: ${{ inputs.version_call != '' }}
|
if: ${{ inputs.version_call != '' }}
|
||||||
uses: ./actions/remove-milestone
|
uses: ./actions/remove-milestone
|
||||||
with:
|
with:
|
||||||
version_call: ${{ inputs.version_call }}
|
version_call: ${{ inputs.version_call }}
|
||||||
token: ${{ secrets.token }}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
|
|||||||
25
.github/workflows/sync-mirror.yml
vendored
Normal file
25
.github/workflows/sync-mirror.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Owned by grafana-delivery-squad
|
||||||
|
# Intended to be dropped into the base repo, Ex: grafana/grafana
|
||||||
|
name: Sync to mirror
|
||||||
|
run-name: sync-to-mirror-${{ github.ref_name }}
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- "main"
|
||||||
|
- "v*.*.*"
|
||||||
|
- "release-*"
|
||||||
|
|
||||||
|
# This is run after the pull request has been merged, so we'll run against the target branch
|
||||||
|
jobs:
|
||||||
|
trigger_downstream_patch_mirror:
|
||||||
|
concurrency: patch-mirror-${{ github.ref_name }}
|
||||||
|
uses: grafana/security-patch-actions/.github/workflows/mirror-branch-and-apply-patches.yml@main
|
||||||
|
if: github.repository == 'grafana/grafana'
|
||||||
|
with:
|
||||||
|
ref: "${{ github.ref_name }}" # this is the target branch name, Ex: "main"
|
||||||
|
src_repo: "${{ github.repository }}"
|
||||||
|
dest_repo: "${{ github.repository }}-security-mirror"
|
||||||
|
patch_repo: "${{ github.repository }}-security-patches"
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
8
.github/workflows/update-changelog.yml
vendored
8
.github/workflows/update-changelog.yml
vendored
@@ -9,6 +9,12 @@ jobs:
|
|||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: "Generate token"
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
- name: Checkout Actions
|
- name: Checkout Actions
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -20,5 +26,5 @@ jobs:
|
|||||||
- name: Run update changelog (manually invoked)
|
- name: Run update changelog (manually invoked)
|
||||||
uses: ./actions/update-changelog
|
uses: ./actions/update-changelog
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -79,6 +79,8 @@ public/css/*.min.css
|
|||||||
/devenv/docker-compose.override.yaml
|
/devenv/docker-compose.override.yaml
|
||||||
/devenv/.env
|
/devenv/.env
|
||||||
/devenv/docker/blocks/tempo/tempo-data/
|
/devenv/docker/blocks/tempo/tempo-data/
|
||||||
|
/devenv/docker/ha-test-unified-alerting/logs/webhook/dumps/
|
||||||
|
/devenv/docker/ha-test-unified-alerting/logs/webhook/webhook-listener.log
|
||||||
|
|
||||||
conf/custom.ini
|
conf/custom.ini
|
||||||
/conf/provisioning/**/custom.yaml
|
/conf/provisioning/**/custom.yaml
|
||||||
@@ -184,3 +186,6 @@ public/locales/*/grafana_old.json
|
|||||||
deployment_tools_config.json
|
deployment_tools_config.json
|
||||||
|
|
||||||
.betterer.cache
|
.betterer.cache
|
||||||
|
|
||||||
|
# Temporary file for backporting PRs
|
||||||
|
.pr-body.txt
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ enable = [
|
|||||||
"typecheck",
|
"typecheck",
|
||||||
"asciicheck",
|
"asciicheck",
|
||||||
"errorlint",
|
"errorlint",
|
||||||
"sqlclosecheck",
|
|
||||||
"revive",
|
"revive",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
452
CHANGELOG.md
452
CHANGELOG.md
@@ -1,3 +1,455 @@
|
|||||||
|
<!-- 9.4.15 START -->
|
||||||
|
|
||||||
|
# 9.4.15 (2023-09-18)
|
||||||
|
|
||||||
|
### Features and enhancements
|
||||||
|
|
||||||
|
- **Chore:** Upgrade Alpine base image to 3.18.3. [#74996](https://github.com/grafana/grafana/issues/74996), [@zerok](https://github.com/zerok)
|
||||||
|
- **Chore:** Upgrade Go to 1.20.8. [#74981](https://github.com/grafana/grafana/issues/74981), [@zerok](https://github.com/zerok)
|
||||||
|
|
||||||
|
<!-- 9.4.15 END -->
|
||||||
|
<!-- 9.4.14 START -->
|
||||||
|
|
||||||
|
# 9.4.14 (2023-09-05)
|
||||||
|
|
||||||
|
### Features and enhancements
|
||||||
|
|
||||||
|
- **Prometheus:** Add present_over_time syntax highlighting. [#72366](https://github.com/grafana/grafana/issues/72366), [@arnaudlemaignen](https://github.com/arnaudlemaignen)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **LDAP:** Fix user disabling. [#74318](https://github.com/grafana/grafana/issues/74318), [@gamab](https://github.com/gamab)
|
||||||
|
- **Plugins:** Only configure plugin proxy transport once. [#71740](https://github.com/grafana/grafana/issues/71740), [@wbrowne](https://github.com/wbrowne)
|
||||||
|
- **InfluxDB:** Interpolate retention policies. [#71202](https://github.com/grafana/grafana/issues/71202), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
- **Azure Monitor:** Fix bug that did not show alert rule preview. [#68561](https://github.com/grafana/grafana/issues/68561), [@alyssabull](https://github.com/alyssabull)
|
||||||
|
|
||||||
|
<!-- 9.4.14 END -->
|
||||||
|
<!-- 9.4.13 START -->
|
||||||
|
|
||||||
|
# 9.4.13 (2023-06-22)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Auth:** Fixed CVE-2023-3128. [#70579](https://github.com/grafana/grafana/issues/70579), [@zerok](https://github.com/zerok)
|
||||||
|
|
||||||
|
<!-- 9.4.13 END -->
|
||||||
|
<!-- 9.4.12 START -->
|
||||||
|
|
||||||
|
# 9.4.12 (2023-06-06)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Query:** Prevent crash while executing concurrent mixed queries
|
||||||
|
- **Alerting:** Require alert.notifications:write permissions to test receivers and templates
|
||||||
|
- **RBAC:** Remove legacy AC editor and admin role on new dashboard route. [#68775](https://github.com/grafana/grafana/issues/68775), [@grafanabot](https://github.com/grafanabot)
|
||||||
|
- **Revert:** Allow editors to access GET /datasources. [#68653](https://github.com/grafana/grafana/issues/68653), [@grafanabot](https://github.com/grafanabot)
|
||||||
|
- **Explore:** Remove data source onboarding page. [#68642](https://github.com/grafana/grafana/issues/68642), [@grafanabot](https://github.com/grafanabot)
|
||||||
|
|
||||||
|
<!-- 9.4.12 END -->
|
||||||
|
<!-- 9.4.10 START -->
|
||||||
|
|
||||||
|
# 9.4.10 (2023-05-08)
|
||||||
|
|
||||||
|
### Features and enhancements
|
||||||
|
|
||||||
|
- **Chore:** Upgrade Go to 1.20.4. [#67760](https://github.com/grafana/grafana/issues/67760), [@papagian](https://github.com/papagian)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **AzureMonitor:** Fix logs query multi-resource and timespan values. [#67931](https://github.com/grafana/grafana/issues/67931), [@grafanabot](https://github.com/grafanabot)
|
||||||
|
- **TimeSeries:** Fix leading null-fill for missing intervals. [#67572](https://github.com/grafana/grafana/issues/67572), [@leeoniya](https://github.com/leeoniya)
|
||||||
|
- **Alerting:** Fix misleading status code in provisioning API. [#67357](https://github.com/grafana/grafana/issues/67357), [@grafanabot](https://github.com/grafanabot)
|
||||||
|
- **Azure Monitor:** Fix bug that was not showing resources for certain locations. [#66617](https://github.com/grafana/grafana/issues/66617), [@grafanabot](https://github.com/grafanabot)
|
||||||
|
|
||||||
|
<!-- 9.4.10 END -->
|
||||||
|
<!-- 9.4.9 START -->
|
||||||
|
|
||||||
|
# 9.4.9 (2023-04-24)
|
||||||
|
|
||||||
|
### Features and enhancements
|
||||||
|
|
||||||
|
- **Chore:** Upgrade Go to 1.20.3. [#66836](https://github.com/grafana/grafana/issues/66836), [@sakjur](https://github.com/sakjur)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Expressions/threshold:** Fix incorrect thresholds args length. [#66925](https://github.com/grafana/grafana/issues/66925), [@gillesdemey](https://github.com/gillesdemey)
|
||||||
|
- **Alerting:** Fix share URL for Prometheus rules on subpath (#66752). [#66802](https://github.com/grafana/grafana/issues/66802), [@gillesdemey](https://github.com/gillesdemey)
|
||||||
|
- **Trace View:** Update the queryType to traceql for checking if same trace when clicking span link. [#66670](https://github.com/grafana/grafana/issues/66670), [@ericmustin](https://github.com/ericmustin)
|
||||||
|
- **Google Cloud Monitoring:** Fix project variable. [#66602](https://github.com/grafana/grafana/issues/66602), [@asimpson](https://github.com/asimpson)
|
||||||
|
- **InfluxDB:** Fix querying with hardcoded retention policy. [#66587](https://github.com/grafana/grafana/issues/66587), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
- **Auth:** Remove the session cookie only if it's invalid or revoked. [#66430](https://github.com/grafana/grafana/issues/66430), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **AccessControl:** Allow editors to access GET /api/datasources. [#66375](https://github.com/grafana/grafana/issues/66375), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **CloudMonitoring:** Add project selector for MQL editor[fix]. [#65844](https://github.com/grafana/grafana/issues/65844), [@alyssabull](https://github.com/alyssabull)
|
||||||
|
|
||||||
|
<!-- 9.4.9 END -->
|
||||||
|
<!-- 9.4.7 START -->
|
||||||
|
|
||||||
|
# 9.4.7 (2023-03-16)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Alerting:** Update scheduler to receive rule updates only from database. [#64780](https://github.com/grafana/grafana/pull/64780), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Influxdb:** Re-introduce backend migration feature toggle. [#64842](https://github.com/grafana/grafana/pull/64842), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
- **Security:** Fixes for CVE-2023-1410. [#65278](https://github.com/grafana/grafana/pull/65278), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
The InfluxDB backend migration feature toggle (influxdbBackendMigration) has been reintroduced in this version as issues were discovered with backend processing of InfluxDB data. Unless this feature toggle is enabled, all InfluxDB data will be parsed in the frontend. This frontend processing is the default behavior.
|
||||||
|
In Grafana 9.4.4, InfluxDB data parsing started to be handled in the backend. If you have upgraded to 9.4.4 and then added new transformations on InfluxDB data, those panels will fail to render. To resolve this either:
|
||||||
|
|
||||||
|
- Remove the affected panel and re-create it
|
||||||
|
- Edit the `time` field as `Time` in `panel.json` or `dashboard.json` Issue [#64842](https://github.com/grafana/grafana/issues/64842)
|
||||||
|
|
||||||
|
<!-- 9.4.7 END -->
|
||||||
|
<!-- 9.4.3 START -->
|
||||||
|
|
||||||
|
# 9.4.3 (2023-03-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Alerting:** Use background context for maintenance function. [#64065](https://github.com/grafana/grafana/pull/64065), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Report Settings:** Fix URL validation. (Enterprise)
|
||||||
|
|
||||||
|
<!-- 9.4.3 END -->
|
||||||
|
<!-- 9.4.2 START -->
|
||||||
|
|
||||||
|
# 9.4.2 (2023-03-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Alerting:** Fix boolean default in migration from false to 0. [#63952](https://github.com/grafana/grafana/pull/63952), [@alexmobo](https://github.com/alexmobo)
|
||||||
|
|
||||||
|
<!-- 9.4.2 END -->
|
||||||
|
<!-- 9.4.1 START -->
|
||||||
|
|
||||||
|
# 9.4.1 (2023-02-28)
|
||||||
|
|
||||||
|
<!-- 9.4.1 END -->
|
||||||
|
<!-- 9.4.0 START -->
|
||||||
|
|
||||||
|
# 9.4.0 (2023-02-28)
|
||||||
|
|
||||||
|
### Features and enhancements
|
||||||
|
|
||||||
|
- **Alerting:** Add endpoint for querying state history. [#62166](https://github.com/grafana/grafana/pull/62166), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Alerting:** Add label query parameters to state history endpoint. [#62831](https://github.com/grafana/grafana/pull/62831), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Alerting:** Add static label to all state history entries. [#62817](https://github.com/grafana/grafana/pull/62817), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Alerting:** Mark AM configuration as applied. [#61330](https://github.com/grafana/grafana/pull/61330), [@santihernandezc](https://github.com/santihernandezc)
|
||||||
|
- **Azure Monitor:** Enable multiple resource queries. [#62467](https://github.com/grafana/grafana/pull/62467), [@andresmgot](https://github.com/andresmgot)
|
||||||
|
- **InfluxDB:** Move database information into jsondata. [#62308](https://github.com/grafana/grafana/pull/62308), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
- **Query Caching:** Add per-panel query caching TTL. [#61968](https://github.com/grafana/grafana/pull/61968), [@mmandrus](https://github.com/mmandrus)
|
||||||
|
- **Table:** Add row number column option. [#62256](https://github.com/grafana/grafana/pull/62256), [@baldm0mma](https://github.com/baldm0mma)
|
||||||
|
- **Tempo:** Remove tempoApmTable feature flag. [#62499](https://github.com/grafana/grafana/pull/62499), [@adrapereira](https://github.com/adrapereira)
|
||||||
|
- **Transformations:** Selectively apply transformation to queries. [#61735](https://github.com/grafana/grafana/pull/61735), [@ryantxu](https://github.com/ryantxu)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **AccessControl:** Clear user permission cache for update org user role. [#62745](https://github.com/grafana/grafana/pull/62745), [@Jguer](https://github.com/Jguer)
|
||||||
|
- **Alerting:** Fix handling of special floating-point cases when writing observed values to annotations. [#61074](https://github.com/grafana/grafana/pull/61074), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Auth:** Rotate token patch. [#62676](https://github.com/grafana/grafana/pull/62676), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **ContextMenu:** Consider y coord when determining bottom collision. [#62403](https://github.com/grafana/grafana/pull/62403), [@gelicia](https://github.com/gelicia)
|
||||||
|
- **Elasticsearch:** Fix consistent label order in alerting. [#62497](https://github.com/grafana/grafana/pull/62497), [@gabor](https://github.com/gabor)
|
||||||
|
- **Explore:** Fix graph not updating when changing config. [#62473](https://github.com/grafana/grafana/pull/62473), [@Elfo404](https://github.com/Elfo404)
|
||||||
|
- **Heatmap:** Support heatmap rows with non-timeseries X axis. [#60929](https://github.com/grafana/grafana/pull/60929), [@ryantxu](https://github.com/ryantxu)
|
||||||
|
- **Login:** Fix panic when a user is upserted by a background process. [#62539](https://github.com/grafana/grafana/pull/62539), [@sakjur](https://github.com/sakjur)
|
||||||
|
- **MSSQL:** Add support for macro function calls. [#62742](https://github.com/grafana/grafana/pull/62742), [@mdvictor](https://github.com/mdvictor)
|
||||||
|
- **MySQL:** Quote identifiers that include special characters. [#61135](https://github.com/grafana/grafana/pull/61135), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||||
|
- **Navigation:** Sign in button now works correctly when served under a sub path. [#62504](https://github.com/grafana/grafana/pull/62504), [@ashharrison90](https://github.com/ashharrison90)
|
||||||
|
- **Nested Folder:** Fix for SQLite not to overwrite the parent on restarts. [#62709](https://github.com/grafana/grafana/pull/62709), [@papagian](https://github.com/papagian)
|
||||||
|
- **PanelChrome:** Adds display mode to support transparent option. [#62647](https://github.com/grafana/grafana/pull/62647), [@torkelo](https://github.com/torkelo)
|
||||||
|
- **Plugins:** Case-sensitive routes for standalone pages. [#62779](https://github.com/grafana/grafana/pull/62779), [@leventebalogh](https://github.com/leventebalogh)
|
||||||
|
- **Plugins:** Prefer to use the data source UID when querying. [#62776](https://github.com/grafana/grafana/pull/62776), [@andresmgot](https://github.com/andresmgot)
|
||||||
|
- **SQLStore:** Fix folder migration for MySQL < 5.7. [#62521](https://github.com/grafana/grafana/pull/62521), [@papagian](https://github.com/papagian)
|
||||||
|
- **Search:** Fix not being able to clear sort value. [#62557](https://github.com/grafana/grafana/pull/62557), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **Tempo:** Fix span name being dropped from the query. [#62257](https://github.com/grafana/grafana/pull/62257), [@CrypticSignal](https://github.com/CrypticSignal)
|
||||||
|
|
||||||
|
### Plugin development fixes & changes
|
||||||
|
|
||||||
|
- **PanelChrome:** Implement hover header. [#61774](https://github.com/grafana/grafana/pull/61774), [@kaydelaney](https://github.com/kaydelaney)
|
||||||
|
|
||||||
|
<!-- 9.4.0 END -->
|
||||||
|
<!-- 9.4.0-beta1 START -->
|
||||||
|
|
||||||
|
# 9.4.0-beta1 (2023-01-30)
|
||||||
|
|
||||||
|
### Features and enhancements
|
||||||
|
|
||||||
|
- **API:** Change how Cache-Control and related headers are set. [#62021](https://github.com/grafana/grafana/pull/62021), [@kylebrandt](https://github.com/kylebrandt)
|
||||||
|
- **AccessControl:** Add high availability support to access control seeder. (Enterprise)
|
||||||
|
- **Accessibility:** Make QueryEditorHelp examples keyboard interactive. [#59355](https://github.com/grafana/grafana/pull/59355), [@idastambuk](https://github.com/idastambuk)
|
||||||
|
- **Admin:** Combine org and admin user pages. [#59365](https://github.com/grafana/grafana/pull/59365), [@Clarity-89](https://github.com/Clarity-89)
|
||||||
|
- **Admin:** Remove navigation subheaders. [#61344](https://github.com/grafana/grafana/pull/61344), [@Clarity-89](https://github.com/Clarity-89)
|
||||||
|
- **AlertGroups:** Generate models.gen.ts from models.cue. [#61227](https://github.com/grafana/grafana/pull/61227), [@Clarity-89](https://github.com/Clarity-89)
|
||||||
|
- **Alerting:** Access query details of provisioned alerts. [#59626](https://github.com/grafana/grafana/pull/59626), [@konrad147](https://github.com/konrad147)
|
||||||
|
- **Alerting:** Add alert rule cloning action. [#59200](https://github.com/grafana/grafana/pull/59200), [@konrad147](https://github.com/konrad147)
|
||||||
|
- **Alerting:** Add dashboard and panel picker to the rule form. [#58304](https://github.com/grafana/grafana/pull/58304), [@konrad147](https://github.com/konrad147)
|
||||||
|
- **Alerting:** Add discord as a possible receiver in cloud rules. [#59366](https://github.com/grafana/grafana/pull/59366), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
|
||||||
|
- **Alerting:** Add export button for exporting all alert rules in alert list view. [#62416](https://github.com/grafana/grafana/pull/62416), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
|
||||||
|
- **Alerting:** Add header X-Grafana-Org-Id to evaluation requests. [#58972](https://github.com/grafana/grafana/pull/58972), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Add landing page. [#59050](https://github.com/grafana/grafana/pull/59050), [@konrad147](https://github.com/konrad147)
|
||||||
|
- **Alerting:** Add maxdatapoints in alert rule form. [#61904](https://github.com/grafana/grafana/pull/61904), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
|
||||||
|
- **Alerting:** Add provisioning endpoint to fetch all rules. [#59989](https://github.com/grafana/grafana/pull/59989), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Alerting:** Add support for settings parse_mode and disable_notifications to Telegram receiver. [#60198](https://github.com/grafana/grafana/pull/60198), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Add support for tracing to alerting scheduler. [#61057](https://github.com/grafana/grafana/pull/61057), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Adds evaluation interval to group view. [#59974](https://github.com/grafana/grafana/pull/59974), [@gillesdemey](https://github.com/gillesdemey)
|
||||||
|
- **Alerting:** Alert rules search improvements. [#61398](https://github.com/grafana/grafana/pull/61398), [@konrad147](https://github.com/konrad147)
|
||||||
|
- **Alerting:** Allow state history to be disabled through configuration. [#61006](https://github.com/grafana/grafana/pull/61006), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Alerting:** Bump Prometheus Alertmanager to v0.25. [#60764](https://github.com/grafana/grafana/pull/60764), [@santihernandezc](https://github.com/santihernandezc)
|
||||||
|
- **Alerting:** Choose a previous valid AM configuration in case of error. [#58472](https://github.com/grafana/grafana/pull/58472), [@santihernandezc](https://github.com/santihernandezc)
|
||||||
|
- **Alerting:** Create endpoints for exporting in provisioning file format. [#58623](https://github.com/grafana/grafana/pull/58623), [@JacobsonMT](https://github.com/JacobsonMT)
|
||||||
|
- **Alerting:** Declare incident from a firing alert. [#61178](https://github.com/grafana/grafana/pull/61178), [@gillesdemey](https://github.com/gillesdemey)
|
||||||
|
- **Alerting:** Do not maintain Normal state. [#56336](https://github.com/grafana/grafana/pull/56336), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Improve UI for making more clear that evaluation interval belongs to the group. [#56397](https://github.com/grafana/grafana/pull/56397), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
|
||||||
|
- **Alerting:** Improve legacy migration to include send reminder & frequency. [#60275](https://github.com/grafana/grafana/pull/60275), [@JacobsonMT](https://github.com/JacobsonMT)
|
||||||
|
- **Alerting:** PagerDuty receiver to let user configure fields Source, Client and Client URL. [#59895](https://github.com/grafana/grafana/pull/59895), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Recognise & change UI for OnCall notification policy + contact point. [#60259](https://github.com/grafana/grafana/pull/60259), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
|
||||||
|
- **Alerting:** Rename contact point type to receiver in the user interface. [#59589](https://github.com/grafana/grafana/pull/59589), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Alerting:** Rule evaluator to get cached data source info. [#61305](https://github.com/grafana/grafana/pull/61305), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Support customizable timeout for screenshots. [#60981](https://github.com/grafana/grafana/pull/60981), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Alerting:** UI changes required to support v3 and Auth in Kafka Contact Point. [#61123](https://github.com/grafana/grafana/pull/61123), [@MohammadGhazanfar](https://github.com/MohammadGhazanfar)
|
||||||
|
- **Alerting:** Update Alerting and Alertmanager to v0.25.1. [#61233](https://github.com/grafana/grafana/pull/61233), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Alerting:** Upload images to Slack via files.upload. [#59163](https://github.com/grafana/grafana/pull/59163), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Auditing/Usage Insights:** Loki support for multi-tenancy. (Enterprise)
|
||||||
|
- **Auth forwarding:** Pass tokens without refresh. [#61634](https://github.com/grafana/grafana/pull/61634), [@Jguer](https://github.com/Jguer)
|
||||||
|
- **Auth:** Add expiry date for service accounts access tokens. [#58885](https://github.com/grafana/grafana/pull/58885), [@linoman](https://github.com/linoman)
|
||||||
|
- **Auth:** Add plugin roles to RolePicker. [#59667](https://github.com/grafana/grafana/pull/59667), [@linoman](https://github.com/linoman)
|
||||||
|
- **Auth:** Add skip_org_role_sync for AzureAD OAuth. [#60322](https://github.com/grafana/grafana/pull/60322), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Add skip_org_role_sync for Okta. [#62106](https://github.com/grafana/grafana/pull/62106), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Add skip_org_role_sync setting for GrafanaCom. [#60553](https://github.com/grafana/grafana/pull/60553), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Add skip_org_role_sync setting for github. [#61673](https://github.com/grafana/grafana/pull/61673), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Add skip_org_role_sync setting to OAuth integration Google. [#61572](https://github.com/grafana/grafana/pull/61572), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Add skip_org_role_sync to GitLab OAuth. [#62055](https://github.com/grafana/grafana/pull/62055), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Add sub claim check to JWT Auth pre-checks. [#61417](https://github.com/grafana/grafana/pull/61417), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **Auth:** Disable team sync for JWT Authentication. [#62191](https://github.com/grafana/grafana/pull/62191), [@eleijonmarck](https://github.com/eleijonmarck)
|
||||||
|
- **Auth:** Display id Provider label in orgs/users view. [#58033](https://github.com/grafana/grafana/pull/58033), [@linoman](https://github.com/linoman)
|
||||||
|
- **Auth:** Implement skip org role sync for jwt. [#61647](https://github.com/grafana/grafana/pull/61647), [@linoman](https://github.com/linoman)
|
||||||
|
- **Auth:** Log a more useful msg if no OAuth provider configured. [#56722](https://github.com/grafana/grafana/pull/56722), [@someone-stole-my-name](https://github.com/someone-stole-my-name)
|
||||||
|
- **Auth:** Set service account access token limit on expiry dates. [#56467](https://github.com/grafana/grafana/pull/56467), [@linoman](https://github.com/linoman)
|
||||||
|
- **Azure Monitor:** Add variable function to list regions. [#62297](https://github.com/grafana/grafana/pull/62297), [@andresmgot](https://github.com/andresmgot)
|
||||||
|
- **Backend:** Consistently use context RemoteAddr function to determine remote address. [#60201](https://github.com/grafana/grafana/pull/60201), [@DanCech](https://github.com/DanCech)
|
||||||
|
- **BarChart:** Highlight bars option for easier interaction. [#60530](https://github.com/grafana/grafana/pull/60530), [@mdvictor](https://github.com/mdvictor)
|
||||||
|
- **BarChartPanel:** Custom tooltips. [#60148](https://github.com/grafana/grafana/pull/60148), [@mdvictor](https://github.com/mdvictor)
|
||||||
|
- **Canvas:** Add server element. [#61104](https://github.com/grafana/grafana/pull/61104), [@drew08t](https://github.com/drew08t)
|
||||||
|
- **Canvas:** Add support for basic arrows. [#57561](https://github.com/grafana/grafana/pull/57561), [@nmarrs](https://github.com/nmarrs)
|
||||||
|
- **Canvas:** Add tooltip for data links. [#61648](https://github.com/grafana/grafana/pull/61648), [@adela-almasan](https://github.com/adela-almasan)
|
||||||
|
- **Canvas:** Improve placement when adding an element via context menu. [#61071](https://github.com/grafana/grafana/pull/61071), [@adela-almasan](https://github.com/adela-almasan)
|
||||||
|
- **Canvas:** Update context menu actions for multiple elements selected. [#61108](https://github.com/grafana/grafana/pull/61108), [@adela-almasan](https://github.com/adela-almasan)
|
||||||
|
- **Canvas:** Update element(s) selection after action. [#61204](https://github.com/grafana/grafana/pull/61204), [@adela-almasan](https://github.com/adela-almasan)
|
||||||
|
- **Chore:** Add deprecation warnings for Sentry. [#60165](https://github.com/grafana/grafana/pull/60165), [@domasx2](https://github.com/domasx2)
|
||||||
|
- **CloudMonitor:** Improve detail of MQL series labels. [#59747](https://github.com/grafana/grafana/pull/59747), [@aangelisc](https://github.com/aangelisc)
|
||||||
|
- **CloudWatch Logs:** Set default logs query and disable button when empty. [#61956](https://github.com/grafana/grafana/pull/61956), [@iwysiu](https://github.com/iwysiu)
|
||||||
|
- **CloudWatch:** Add CloudWatchSynthetics dimension. [#60832](https://github.com/grafana/grafana/pull/60832), [@jangaraj](https://github.com/jangaraj)
|
||||||
|
- **CloudWatch:** Add MaxProvisionedTableReadCapacityUtilization AWS/DynamoDB metric name. [#60829](https://github.com/grafana/grafana/pull/60829), [@jangaraj](https://github.com/jangaraj)
|
||||||
|
- **CloudWatch:** Add RDS dimension. [#61027](https://github.com/grafana/grafana/pull/61027), [@jangaraj](https://github.com/jangaraj)
|
||||||
|
- **CloudWatch:** Add macro for resolving period in SEARCH expressions. [#60435](https://github.com/grafana/grafana/pull/60435), [@sunker](https://github.com/sunker)
|
||||||
|
- **Cloudwatch:** Add feedback labels to log groups selector. [#60619](https://github.com/grafana/grafana/pull/60619), [@sunker](https://github.com/sunker)
|
||||||
|
- **Cloudwatch:** Add run query button. [#60089](https://github.com/grafana/grafana/pull/60089), [@sunker](https://github.com/sunker)
|
||||||
|
- **Cloudwatch:** Add support for template variables in new log group picker. [#61243](https://github.com/grafana/grafana/pull/61243), [@sunker](https://github.com/sunker)
|
||||||
|
- **Cloudwatch:** Define and use getDefaultquery instead of calling onChange on mount. [#60221](https://github.com/grafana/grafana/pull/60221), [@idastambuk](https://github.com/idastambuk)
|
||||||
|
- **Cloudwatch:** Refactor log group model. [#60873](https://github.com/grafana/grafana/pull/60873), [@sunker](https://github.com/sunker)
|
||||||
|
- **Cloudwatch:** Set CloudwatchCrossAccountQuery feature to stable. [#62348](https://github.com/grafana/grafana/pull/62348), [@sarahzinger](https://github.com/sarahzinger)
|
||||||
|
- **Cloudwatch:** Use new log group picker also for non cross-account queries. [#60913](https://github.com/grafana/grafana/pull/60913), [@sunker](https://github.com/sunker)
|
||||||
|
- **CommandPalette:** Improve section header styling. [#61584](https://github.com/grafana/grafana/pull/61584), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **CommandPalette:** Minor usability improvements. [#61567](https://github.com/grafana/grafana/pull/61567), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **CommandPalette:** Search for dashboards using API. [#61090](https://github.com/grafana/grafana/pull/61090), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **Config:** Support JSON list syntax. [#61288](https://github.com/grafana/grafana/pull/61288), [@alexanderzobnin](https://github.com/alexanderzobnin)
|
||||||
|
- **DataLinks:** Allow providing a dynamic data link builder. [#60452](https://github.com/grafana/grafana/pull/60452), [@dprokop](https://github.com/dprokop)
|
||||||
|
- **DataProxy:** Populate X-Grafana-Referer header. [#60040](https://github.com/grafana/grafana/pull/60040), [@neilfordyce](https://github.com/neilfordyce)
|
||||||
|
- **Database:** Adds support for enable/disable SQLite Write-Ahead Logging (WAL) via configuration. [#58268](https://github.com/grafana/grafana/pull/58268), [@marefr](https://github.com/marefr)
|
||||||
|
- **Dataplane:** Deprecate timeseries-many in favor of timeseries-multi. [#59070](https://github.com/grafana/grafana/pull/59070), [@bohandley](https://github.com/bohandley)
|
||||||
|
- **Datasource settings:** Add deprecation notice for database field. [#58647](https://github.com/grafana/grafana/pull/58647), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||||
|
- **Datasources:** Add support for getDetDefaultQuery in variable editor. [#62026](https://github.com/grafana/grafana/pull/62026), [@idastambuk](https://github.com/idastambuk)
|
||||||
|
- **Devenv:** OpenLDAP-Mac improvements. [#60229](https://github.com/grafana/grafana/pull/60229), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **Docs:** Rename Message templates to Notification templates. [#59477](https://github.com/grafana/grafana/pull/59477), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Docs:** Unified Alerting is now compatible with AWS Aurora. [#61001](https://github.com/grafana/grafana/pull/61001), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Elastic:** Remove experimental tag from v8.0+. [#61359](https://github.com/grafana/grafana/pull/61359), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Elasticsearch:** Deprecate raw document mode. [#62236](https://github.com/grafana/grafana/pull/62236), [@gabor](https://github.com/gabor)
|
||||||
|
- **Elasticsearch:** Support nested aggregation. [#62301](https://github.com/grafana/grafana/pull/62301), [@gabor](https://github.com/gabor)
|
||||||
|
- **Email:** Use MJML email template. (Enterprise)
|
||||||
|
- **Email:** Use MJML email templates. [#57751](https://github.com/grafana/grafana/pull/57751), [@gillesdemey](https://github.com/gillesdemey)
|
||||||
|
- **Explore:** Add feature to open log sample in split view. [#62097](https://github.com/grafana/grafana/pull/62097), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||||
|
- **Explore:** Enable resize of split pane. [#58683](https://github.com/grafana/grafana/pull/58683), [@gelicia](https://github.com/gelicia)
|
||||||
|
- **Explore:** Implement logs sample in Explore. [#61864](https://github.com/grafana/grafana/pull/61864), [@ivanahuckova](https://github.com/ivanahuckova)
|
||||||
|
- **Explore:** Keyboard shortcut to go to explore. [#61837](https://github.com/grafana/grafana/pull/61837), [@torkelo](https://github.com/torkelo)
|
||||||
|
- **Explore:** Notify when compact URL is used. [#58684](https://github.com/grafana/grafana/pull/58684), [@gelicia](https://github.com/gelicia)
|
||||||
|
- **Explore:** Use Datasource Onboarding page when visiting without any datasource set up. [#60399](https://github.com/grafana/grafana/pull/60399), [@Elfo404](https://github.com/Elfo404)
|
||||||
|
- **FileDropzone:** Format the file size limit in the error message when the max file size is exceeded (1000 => 1 kB). [#62290](https://github.com/grafana/grafana/pull/62290), [@oscarkilhed](https://github.com/oscarkilhed)
|
||||||
|
- **Flame graph:** Search with uFuzzy. [#61748](https://github.com/grafana/grafana/pull/61748), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **GRPC Server:** Add query service. [#55781](https://github.com/grafana/grafana/pull/55781), [@toddtreece](https://github.com/toddtreece)
|
||||||
|
- **Geomap panel:** Generate types. [#61636](https://github.com/grafana/grafana/pull/61636), [@Clarity-89](https://github.com/Clarity-89)
|
||||||
|
- **Geomap:** Add color gradients to route layer. [#59062](https://github.com/grafana/grafana/pull/59062), [@drew08t](https://github.com/drew08t)
|
||||||
|
- **Glue:** Validate target query in correlations page. [#57245](https://github.com/grafana/grafana/pull/57245), [@L-M-K-B](https://github.com/L-M-K-B)
|
||||||
|
- **Heatmap:** Remove legacy angular based implementation. [#59249](https://github.com/grafana/grafana/pull/59249), [@ryantxu](https://github.com/ryantxu)
|
||||||
|
- **InfluxDB:** Send retention policy with InfluxQL queries if its been specified. [#62149](https://github.com/grafana/grafana/pull/62149), [@brettbuddin](https://github.com/brettbuddin)
|
||||||
|
- **Influxdb:** Remove backend migration feature toggle. [#61308](https://github.com/grafana/grafana/pull/61308), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
- **Internationalization:** Translate page headers and Search dashboard actions. [#60727](https://github.com/grafana/grafana/pull/60727), [@TaitChan](https://github.com/TaitChan)
|
||||||
|
- **LDAP:** Make LDAP attribute mapping case-insensitive. [#58992](https://github.com/grafana/grafana/pull/58992), [@markkrj](https://github.com/markkrj)
|
||||||
|
- **LoginAttempts:** Reset attempts on successfull password reset. [#59215](https://github.com/grafana/grafana/pull/59215), [@kalleep](https://github.com/kalleep)
|
||||||
|
- **Logs Panel:** Add support for keyboard interactions with log lines. [#60561](https://github.com/grafana/grafana/pull/60561), [@matyax](https://github.com/matyax)
|
||||||
|
- **Logs:** Add possibility to download logs in JSON format. [#61394](https://github.com/grafana/grafana/pull/61394), [@svennergr](https://github.com/svennergr)
|
||||||
|
- **Logs:** Make `no logs found` text more visible in Explore. [#61651](https://github.com/grafana/grafana/pull/61651), [@svennergr](https://github.com/svennergr)
|
||||||
|
- **Logs:** Unify detected fields and labels in Log Details. [#60448](https://github.com/grafana/grafana/pull/60448), [@svennergr](https://github.com/svennergr)
|
||||||
|
- **Loki Autocomplete:** Suggest only possible labels for unwrap. [#61411](https://github.com/grafana/grafana/pull/61411), [@matyax](https://github.com/matyax)
|
||||||
|
- **Loki Editor Autocomplete:** Suggest unique history items. [#60262](https://github.com/grafana/grafana/pull/60262), [@matyax](https://github.com/matyax)
|
||||||
|
- **Loki Query Editor:** Add support to display query parsing errors to users. [#59427](https://github.com/grafana/grafana/pull/59427), [@matyax](https://github.com/matyax)
|
||||||
|
- **Loki Query Editor:** Autocompletion and suggestions improvements (unwrap, parser, extracted labels). [#59103](https://github.com/grafana/grafana/pull/59103), [@matyax](https://github.com/matyax)
|
||||||
|
- **Loki Query Editor:** Update history items with successive queries. [#60327](https://github.com/grafana/grafana/pull/60327), [@matyax](https://github.com/matyax)
|
||||||
|
- **Loki:** Add format explanation to regex operations. [#60518](https://github.com/grafana/grafana/pull/60518), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Add hints for query filters. [#60293](https://github.com/grafana/grafana/pull/60293), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Add improvements to loki label browser. [#59387](https://github.com/grafana/grafana/pull/59387), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Change format of query builder hints. [#60228](https://github.com/grafana/grafana/pull/60228), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Make label browser accessible in query builder. [#58525](https://github.com/grafana/grafana/pull/58525), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Push support for multi-tenancy mode. [#60866](https://github.com/grafana/grafana/pull/60866), [@joanlopez](https://github.com/joanlopez)
|
||||||
|
- **Loki:** Remove raw query toggle. [#59125](https://github.com/grafana/grafana/pull/59125), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Rename "explain" toggle to "explain query". [#61150](https://github.com/grafana/grafana/pull/61150), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Set custom width for modals in the loki query editor. [#59714](https://github.com/grafana/grafana/pull/59714), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Show configured log line limit. [#61291](https://github.com/grafana/grafana/pull/61291), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Loki:** Show query size approximation. [#62109](https://github.com/grafana/grafana/pull/62109), [@gwdawson](https://github.com/gwdawson)
|
||||||
|
- **Middleware:** Add Custom Headers to HTTP responses. [#59018](https://github.com/grafana/grafana/pull/59018), [@jcalisto](https://github.com/jcalisto)
|
||||||
|
- **Navigation:** Open command palette from search box. [#61667](https://github.com/grafana/grafana/pull/61667), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **NodeGraph:** Allow usage with single dataframe. [#58448](https://github.com/grafana/grafana/pull/58448), [@aocenas](https://github.com/aocenas)
|
||||||
|
- **OAuth:** Support pagination for GitHub orgs. [#58648](https://github.com/grafana/grafana/pull/58648), [@sdague](https://github.com/sdague)
|
||||||
|
- **PanelChrome:** Allow panel to be dragged if set as draggable from the outside. [#61698](https://github.com/grafana/grafana/pull/61698), [@axelavargas](https://github.com/axelavargas)
|
||||||
|
- **PanelChrome:** Refactor and refine items next to title. [#60514](https://github.com/grafana/grafana/pull/60514), [@axelavargas](https://github.com/axelavargas)
|
||||||
|
- **PanelRenderer:** Interpolate variables in applyFieldOverrides. [#59844](https://github.com/grafana/grafana/pull/59844), [@connorlindsey](https://github.com/connorlindsey)
|
||||||
|
- **Performance:** Preallocate slices. [#61580](https://github.com/grafana/grafana/pull/61580), [@peakle](https://github.com/peakle)
|
||||||
|
- **Phlare:** Reset flame graph after query is run. [#59609](https://github.com/grafana/grafana/pull/59609), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **Phlare:** Transition from LogQL/PromQL to Phlare should keep the query. [#60217](https://github.com/grafana/grafana/pull/60217), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **Plugins:** Add file permission error check when attempting to verify plugin signature. [#61860](https://github.com/grafana/grafana/pull/61860), [@wbrowne](https://github.com/wbrowne)
|
||||||
|
- **Plugins:** Automatically forward plugin request HTTP headers in outgoing HTTP requests. [#60417](https://github.com/grafana/grafana/pull/60417), [@marefr](https://github.com/marefr)
|
||||||
|
- **Plugins:** Forward user header (X-Grafana-User) in backend plugin requests. [#58646](https://github.com/grafana/grafana/pull/58646), [@marefr](https://github.com/marefr)
|
||||||
|
- **Plugins:** Pass through dashboard/contextual HTTP headers to plugins/datasources. [#60301](https://github.com/grafana/grafana/pull/60301), [@GiedriusS](https://github.com/GiedriusS)
|
||||||
|
- **Plugins:** Refactor forward of cookies, OAuth token and header modifications by introducing client middlewares. [#58132](https://github.com/grafana/grafana/pull/58132), [@marefr](https://github.com/marefr)
|
||||||
|
- **Plugins:** Remove connection/hop-by-hop request/response headers for call resource. [#60077](https://github.com/grafana/grafana/pull/60077), [@marefr](https://github.com/marefr)
|
||||||
|
- **Plugins:** Unsigned chromium file should not invalidate signature for Renderer plugin. [#59104](https://github.com/grafana/grafana/pull/59104), [@wbrowne](https://github.com/wbrowne)
|
||||||
|
- **Preferences:** Add pagination to org configuration page. [#60896](https://github.com/grafana/grafana/pull/60896), [@alexanderzobnin](https://github.com/alexanderzobnin)
|
||||||
|
- **Preferences:** Add theme preference to match system theme. [#61986](https://github.com/grafana/grafana/pull/61986), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **Prometheus:** Kickstart your query, formerly query patterns. [#60718](https://github.com/grafana/grafana/pull/60718), [@bohandley](https://github.com/bohandley)
|
||||||
|
- **Prometheus:** New instant query results view in Explore. [#60479](https://github.com/grafana/grafana/pull/60479), [@gtk-grafana](https://github.com/gtk-grafana)
|
||||||
|
- **Prometheus:** Remove buffered client and feature toggle related to it. [#59898](https://github.com/grafana/grafana/pull/59898), [@itsmylife](https://github.com/itsmylife)
|
||||||
|
- **Public Dashboards:** Time range for public dashboard in NavToolbar. [#60689](https://github.com/grafana/grafana/pull/60689), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** A unique page for public dashboards. [#60744](https://github.com/grafana/grafana/pull/60744), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Add react-hook-form for Public Dashboard modal. [#60249](https://github.com/grafana/grafana/pull/60249), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Add share column to public dashboards table. [#61102](https://github.com/grafana/grafana/pull/61102), [@owensmallwood](https://github.com/owensmallwood)
|
||||||
|
- **PublicDashboards:** Adds middleware for email sharing. (Enterprise)
|
||||||
|
- **PublicDashboards:** Adds tables and models for email sharing. (Enterprise)
|
||||||
|
- **PublicDashboards:** Checkboxes list refactor. [#61947](https://github.com/grafana/grafana/pull/61947), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Create API for sharing by email. (Enterprise)
|
||||||
|
- **PublicDashboards:** Enterprise service skeleton for public dashboards with feature flag. (Enterprise)
|
||||||
|
- **PublicDashboards:** Modal warns when using unsupported datasources. [#58926](https://github.com/grafana/grafana/pull/58926), [@owensmallwood](https://github.com/owensmallwood)
|
||||||
|
- **PublicDashboards:** Page to request access to protected pubdash. (Enterprise)
|
||||||
|
- **PublicDashboards:** Remove unnecessary css style in Audit Table. [#60546](https://github.com/grafana/grafana/pull/60546), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Revert Time range setting added. [#60698](https://github.com/grafana/grafana/pull/60698), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Time range conditionally shown. [#60425](https://github.com/grafana/grafana/pull/60425), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Time range setting added. [#60487](https://github.com/grafana/grafana/pull/60487), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Time range settings. [#61585](https://github.com/grafana/grafana/pull/61585), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Time range switch added. [#60257](https://github.com/grafana/grafana/pull/60257), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Time range wording changed. [#60473](https://github.com/grafana/grafana/pull/60473), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **RBAC:** Add an endpoint to search through assignments. (Enterprise)
|
||||||
|
- **RBAC:** Add config option to reset basic roles on start up. [#59598](https://github.com/grafana/grafana/pull/59598), [@gamab](https://github.com/gamab)
|
||||||
|
- **RBAC:** Add config option to reset basic roles on start up. (Enterprise)
|
||||||
|
- **RBAC:** Add permission to get usage report preview. [#61570](https://github.com/grafana/grafana/pull/61570), [@alexanderzobnin](https://github.com/alexanderzobnin)
|
||||||
|
- **RBAC:** Permission check performance improvements for the new search. [#60729](https://github.com/grafana/grafana/pull/60729), [@IevaVasiljeva](https://github.com/IevaVasiljeva)
|
||||||
|
- **RBAC:** Register plugin permissions's action and its accepted scopes. (Enterprise)
|
||||||
|
- **RBAC:** Runtime plugin role registration and update. (Enterprise)
|
||||||
|
- **Report Settings:** Add UI to upload logo files. (Enterprise)
|
||||||
|
- **Reporting:** Allow to upload report branding images. (Enterprise)
|
||||||
|
- **RolePicker:** Align groupHeader to the list items horizontally. [#61060](https://github.com/grafana/grafana/pull/61060), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **SAML:** Support auto login. [#61685](https://github.com/grafana/grafana/pull/61685), [@alexanderzobnin](https://github.com/alexanderzobnin)
|
||||||
|
- **SMTP:** Update SMTP TemplatesPatterns to do an 'or' filter instead of 'and'. [#61421](https://github.com/grafana/grafana/pull/61421), [@mmandrus](https://github.com/mmandrus)
|
||||||
|
- **SQL Datasources:** Move database setting to jsonData. [#58649](https://github.com/grafana/grafana/pull/58649), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||||
|
- **SQL Datasources:** Use health check for config test. [#59867](https://github.com/grafana/grafana/pull/59867), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||||
|
- **SQL:** Return no data response when no rows returned. [#59121](https://github.com/grafana/grafana/pull/59121), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||||
|
- **Search:** Remember sorting preference between visits. [#62248](https://github.com/grafana/grafana/pull/62248), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **Segment:** Individual segments are now keyboard accessible. [#60555](https://github.com/grafana/grafana/pull/60555), [@ashharrison90](https://github.com/ashharrison90)
|
||||||
|
- **Server:** Switch from separate server & cli to a unified grafana binary. [#58286](https://github.com/grafana/grafana/pull/58286), [@DanCech](https://github.com/DanCech)
|
||||||
|
- **SharePDF:** Add zoom select. (Enterprise)
|
||||||
|
- **Slugify:** Replace gosimple/slug with a simple function. [#59517](https://github.com/grafana/grafana/pull/59517), [@ryantxu](https://github.com/ryantxu)
|
||||||
|
- **Snapshots:** Add snapshot enable config. [#61587](https://github.com/grafana/grafana/pull/61587), [@leandro-deveikis](https://github.com/leandro-deveikis)
|
||||||
|
- **Table Panel:** Refactor Cell Options to Allow for Options per Cell Type. [#59363](https://github.com/grafana/grafana/pull/59363), [@codeincarnate](https://github.com/codeincarnate)
|
||||||
|
- **Table panel:** Use link elements instead of div elements with on click events to aid with keyboard accessibility. [#59393](https://github.com/grafana/grafana/pull/59393), [@oscarkilhed](https://github.com/oscarkilhed)
|
||||||
|
- **TablePanel:** Improve and align table styles with the rest of Grafana. [#60365](https://github.com/grafana/grafana/pull/60365), [@torkelo](https://github.com/torkelo)
|
||||||
|
- **Teams:** Support paginating and filtering more then 1000 teams. [#58761](https://github.com/grafana/grafana/pull/58761), [@kalleep](https://github.com/kalleep)
|
||||||
|
- **Teams:** Use generated TS types. [#60618](https://github.com/grafana/grafana/pull/60618), [@Clarity-89](https://github.com/Clarity-89)
|
||||||
|
- **Tempo:** Trace to logs custom query with interpolation. [#61702](https://github.com/grafana/grafana/pull/61702), [@aocenas](https://github.com/aocenas)
|
||||||
|
- **Tempo:** Update column width for Loki search. [#61924](https://github.com/grafana/grafana/pull/61924), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **Tempo:** Update docs and default Tempo metrics query. [#62185](https://github.com/grafana/grafana/pull/62185), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **TestDatasource:** Add scenario for generating trace data. [#59299](https://github.com/grafana/grafana/pull/59299), [@aocenas](https://github.com/aocenas)
|
||||||
|
- **TextPanel:** Refactor to functional component. [#60885](https://github.com/grafana/grafana/pull/60885), [@ryantxu](https://github.com/ryantxu)
|
||||||
|
- **Theme:** Use `Inter` font by default. [#59544](https://github.com/grafana/grafana/pull/59544), [@ashharrison90](https://github.com/ashharrison90)
|
||||||
|
- **Trace View:** Disallow a span colour that is the same or looks similar to previous colour. [#58146](https://github.com/grafana/grafana/pull/58146), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **Tracing:** Add keyboard accessibility to SpanDetailRow. [#59412](https://github.com/grafana/grafana/pull/59412), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **Transformations:** Add context parameter to transformDataFrame and operators. [#60694](https://github.com/grafana/grafana/pull/60694), [@torkelo](https://github.com/torkelo)
|
||||||
|
- **Transformations:** Extract JSON Paths. [#59400](https://github.com/grafana/grafana/pull/59400), [@NiklasCi](https://github.com/NiklasCi)
|
||||||
|
- **Transformations:** Grouping to matrix empty value option. [#55591](https://github.com/grafana/grafana/pull/55591), [@hugo082](https://github.com/hugo082)
|
||||||
|
- **UsageInsights:** Record events for Explore queries. [#59931](https://github.com/grafana/grafana/pull/59931), [@daniellee](https://github.com/daniellee)
|
||||||
|
- **Variables:** Support for colons in time variables custom format. [#61404](https://github.com/grafana/grafana/pull/61404), [@yesoreyeram](https://github.com/yesoreyeram)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- **Alerting:** Fix ConditionsCmd No Data for "has no value". [#58634](https://github.com/grafana/grafana/pull/58634), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Alerting:** Fix evaluation timeout. [#61303](https://github.com/grafana/grafana/pull/61303), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Alerting:** Redo refactoring from reverted fix in #56812. [#61051](https://github.com/grafana/grafana/pull/61051), [@grobinson-grafana](https://github.com/grobinson-grafana)
|
||||||
|
- **Alerting:** Set Dashboard and Panel IDs on rule group replacement. [#60374](https://github.com/grafana/grafana/pull/60374), [@alexmobo](https://github.com/alexmobo)
|
||||||
|
- **Alerting:** Store alertmanager configuration history in a separate table in the database. [#60197](https://github.com/grafana/grafana/pull/60197), [@alexweav](https://github.com/alexweav)
|
||||||
|
- **Azure Monitor:** Fix health check for empty default subscription. [#60569](https://github.com/grafana/grafana/pull/60569), [@andresmgot](https://github.com/andresmgot)
|
||||||
|
- **Barchart:** Fix erroneous tooltip value. [#61455](https://github.com/grafana/grafana/pull/61455), [@mdvictor](https://github.com/mdvictor)
|
||||||
|
- **Candlestick:** Fix showing hidden legend values. [#60971](https://github.com/grafana/grafana/pull/60971), [@zoltanbedi](https://github.com/zoltanbedi)
|
||||||
|
- **CloudWatch:** Fix logs insights deeplink. [#59906](https://github.com/grafana/grafana/pull/59906), [@fridgepoet](https://github.com/fridgepoet)
|
||||||
|
- **Cloudmonitor:** Refactor query builder. [#61410](https://github.com/grafana/grafana/pull/61410), [@aangelisc](https://github.com/aangelisc)
|
||||||
|
- **Command Palette:** Links now work when grafana is served under a subpath. [#60033](https://github.com/grafana/grafana/pull/60033), [@ashharrison90](https://github.com/ashharrison90)
|
||||||
|
- **CommandPalette:** Fix long dashboard names freezing the browser. [#61278](https://github.com/grafana/grafana/pull/61278), [@joshhunt](https://github.com/joshhunt)
|
||||||
|
- **DataFrame:** Add explicit histogram frame type. [#61195](https://github.com/grafana/grafana/pull/61195), [@leeoniya](https://github.com/leeoniya)
|
||||||
|
- **Dropdown:** Make escape close a dropdown. [#62098](https://github.com/grafana/grafana/pull/62098), [@ashharrison90](https://github.com/ashharrison90)
|
||||||
|
- **Explore:** Fix a11y issue with show all series button in Graph. [#58943](https://github.com/grafana/grafana/pull/58943), [@Elfo404](https://github.com/Elfo404)
|
||||||
|
- **Explore:** Fixes explore page height and margin issues. [#59865](https://github.com/grafana/grafana/pull/59865), [@torkelo](https://github.com/torkelo)
|
||||||
|
- **Explore:** Re-initialize graph when number of series to show changes. [#60499](https://github.com/grafana/grafana/pull/60499), [@Elfo404](https://github.com/Elfo404)
|
||||||
|
- **Fix:** Unlocking the UI for AuthProxy users. [#59507](https://github.com/grafana/grafana/pull/59507), [@gamab](https://github.com/gamab)
|
||||||
|
- **GrafanaUI:** Checkbox description fix. [#61929](https://github.com/grafana/grafana/pull/61929), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **LDAP:** Disable user in case it has been removed from LDAP directory. [#60231](https://github.com/grafana/grafana/pull/60231), [@mgyongyosi](https://github.com/mgyongyosi)
|
||||||
|
- **LibraryPanels:** Fix issue where viewer with folder edit permissions could not update library panel. [#58420](https://github.com/grafana/grafana/pull/58420), [@kaydelaney](https://github.com/kaydelaney)
|
||||||
|
- **Loki Query Builder:** Fix bug parsing range params. [#61678](https://github.com/grafana/grafana/pull/61678), [@matyax](https://github.com/matyax)
|
||||||
|
- **MultiSelect:** Fix `actionMeta` not available in `onChange` callback. [#62339](https://github.com/grafana/grafana/pull/62339), [@svennergr](https://github.com/svennergr)
|
||||||
|
- **Navigation:** Fix finding the active nav item for plugins. [#62123](https://github.com/grafana/grafana/pull/62123), [@leventebalogh](https://github.com/leventebalogh)
|
||||||
|
- **PanelChrome:** Allow hovering on description when status error is visible. [#61757](https://github.com/grafana/grafana/pull/61757), [@ivanortegaalba](https://github.com/ivanortegaalba)
|
||||||
|
- **PanelEditor:** Fixes issue where panel edit would show the panel plugin options of the previous edit panel. [#59861](https://github.com/grafana/grafana/pull/59861), [@torkelo](https://github.com/torkelo)
|
||||||
|
- **PublicDashboards:** Footer alignment fix for Firefox browser. [#62108](https://github.com/grafana/grafana/pull/62108), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **PublicDashboards:** Footer position fix. [#61954](https://github.com/grafana/grafana/pull/61954), [@juanicabanas](https://github.com/juanicabanas)
|
||||||
|
- **RBAC:** Fix DeleteUserPermissions not being called on Upsert org sync. [#60531](https://github.com/grafana/grafana/pull/60531), [@Jguer](https://github.com/Jguer)
|
||||||
|
- **RBAC:** Handle edge case where there is duplicated acl entries for a role on a single dashboard. [#58079](https://github.com/grafana/grafana/pull/58079), [@kalleep](https://github.com/kalleep)
|
||||||
|
- **Resource Query Cache:** Do not store 207 status codes. (Enterprise)
|
||||||
|
- **SAML:** Do not register SAML support bundle collector when SAML is disabled. (Enterprise)
|
||||||
|
- **SSE:** Fix math expression to support NoData results. [#61721](https://github.com/grafana/grafana/pull/61721), [@yuri-tceretian](https://github.com/yuri-tceretian)
|
||||||
|
- **Security:** Fix XSS in runbook URL. [#59540](https://github.com/grafana/grafana/pull/59540), [@dsotirakis](https://github.com/dsotirakis)
|
||||||
|
- **TimeSeries:** Better y-axis ticks for IEC units. [#59984](https://github.com/grafana/grafana/pull/59984), [@leeoniya](https://github.com/leeoniya)
|
||||||
|
- **TimeSeries:** Fix rendering when zooming to time ranges between datapoints. [#59444](https://github.com/grafana/grafana/pull/59444), [@leeoniya](https://github.com/leeoniya)
|
||||||
|
- **TimeSeries:** Fix y-axis Yes/No and On/Off boolean units. [#61207](https://github.com/grafana/grafana/pull/61207), [@leeoniya](https://github.com/leeoniya)
|
||||||
|
- **Traces:** Fix for multiple $\_\_tags in trace to metrics. [#59641](https://github.com/grafana/grafana/pull/59641), [@joey-grafana](https://github.com/joey-grafana)
|
||||||
|
- **Variables:** Allow user to filter values in dropdown using white space. [#60622](https://github.com/grafana/grafana/pull/60622), [@yusuf-multhan](https://github.com/yusuf-multhan)
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
Removes the non-functional feature toggle `influxdbBackendMigration`. InfluxDB is working %100 with server access mode. You can keep using your dashboards, and data sources as you have been using. This won't affect them. If you are upgrading from older versions of Grafana please be sure to check your dashboard config and check for warnings. Issue [#61308](https://github.com/grafana/grafana/issues/61308)
|
||||||
|
|
||||||
|
Removes support for "detected fields" in the details of a log line, however all supported interactions (filter, statistics, visibility) are now supported for all fields. If you are using Loki you can get those fields back by using a parser operation like `logfmt` or `json`.
|
||||||
|
Issue [#60448](https://github.com/grafana/grafana/issues/60448)
|
||||||
|
|
||||||
|
### Deprecations
|
||||||
|
|
||||||
|
In the elasticsearch data source, the "Raw document" display mode is deprecated. We recommend using the "Raw Data" mode instead. Issue [#62236](https://github.com/grafana/grafana/issues/62236)
|
||||||
|
|
||||||
|
Sentry frontend logging provider will be removed with next major version. Issue [#60165](https://github.com/grafana/grafana/issues/60165)
|
||||||
|
|
||||||
|
### Plugin development fixes & changes
|
||||||
|
|
||||||
|
- **FileDropzone:** Display max file size. [#62334](https://github.com/grafana/grafana/pull/62334), [@oscarkilhed](https://github.com/oscarkilhed)
|
||||||
|
- **Chore:** Bump d3-color to 3.1.0. [#61609](https://github.com/grafana/grafana/pull/61609), [@jackw](https://github.com/jackw)
|
||||||
|
- **UI/Alert:** Infer the `role` property based on the `severity`. [#61242](https://github.com/grafana/grafana/pull/61242), [@leventebalogh](https://github.com/leventebalogh)
|
||||||
|
- **PanelChrome:** Menu is wrapped in a render prop for full outside control. [#60537](https://github.com/grafana/grafana/pull/60537), [@polibb](https://github.com/polibb)
|
||||||
|
- **Toolkit:** Deprecate all plugin related commands. [#60290](https://github.com/grafana/grafana/pull/60290), [@academo](https://github.com/academo)
|
||||||
|
- **Grafana UI:** Add experimental InteractiveTable component. [#58223](https://github.com/grafana/grafana/pull/58223), [@Elfo404](https://github.com/Elfo404)
|
||||||
|
|
||||||
|
<!-- 9.4.0-beta1 END -->
|
||||||
<!-- 9.3.6 START -->
|
<!-- 9.3.6 START -->
|
||||||
|
|
||||||
# 9.3.6 (2023-01-26)
|
# 9.3.6 (2023-01-26)
|
||||||
|
|||||||
14
Dockerfile
14
Dockerfile
@@ -1,8 +1,8 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG BASE_IMAGE=alpine:3.15
|
ARG BASE_IMAGE=alpine:3.18.3
|
||||||
ARG JS_IMAGE=node:18-alpine3.15
|
ARG JS_IMAGE=node:18-alpine3.18
|
||||||
ARG GO_IMAGE=golang:1.19.4-alpine3.17
|
ARG GO_IMAGE=golang:1.20.10-alpine3.18
|
||||||
|
|
||||||
ARG GO_SRC=go-builder
|
ARG GO_SRC=go-builder
|
||||||
ARG JS_SRC=js-builder
|
ARG JS_SRC=js-builder
|
||||||
@@ -47,6 +47,7 @@ RUN go mod download && \
|
|||||||
COPY embed.go Makefile build.go package.json ./
|
COPY embed.go Makefile build.go package.json ./
|
||||||
COPY cue.mod cue.mod
|
COPY cue.mod cue.mod
|
||||||
COPY kinds kinds
|
COPY kinds kinds
|
||||||
|
COPY local local
|
||||||
COPY packages/grafana-schema packages/grafana-schema
|
COPY packages/grafana-schema packages/grafana-schema
|
||||||
COPY public/app/plugins public/app/plugins
|
COPY public/app/plugins public/app/plugins
|
||||||
COPY public/api-spec.json public/api-spec.json
|
COPY public/api-spec.json public/api-spec.json
|
||||||
@@ -54,6 +55,7 @@ COPY pkg pkg
|
|||||||
COPY scripts scripts
|
COPY scripts scripts
|
||||||
COPY conf conf
|
COPY conf conf
|
||||||
COPY .github .github
|
COPY .github .github
|
||||||
|
COPY LICENSE ./
|
||||||
|
|
||||||
RUN make build-go
|
RUN make build-go
|
||||||
|
|
||||||
@@ -97,7 +99,7 @@ RUN if grep -i -q alpine /etc/issue; then \
|
|||||||
elif grep -i -q ubuntu /etc/issue; then \
|
elif grep -i -q ubuntu /etc/issue; then \
|
||||||
DEBIAN_FRONTEND=noninteractive && \
|
DEBIAN_FRONTEND=noninteractive && \
|
||||||
apt-get update && \
|
apt-get update && \
|
||||||
apt-get install -y ca-certificates curl tzdata && \
|
apt-get install -y ca-certificates curl tzdata musl && \
|
||||||
apt-get autoremove -y && \
|
apt-get autoremove -y && \
|
||||||
rm -rf /var/lib/apt/lists/*; \
|
rm -rf /var/lib/apt/lists/*; \
|
||||||
else \
|
else \
|
||||||
@@ -106,11 +108,12 @@ RUN if grep -i -q alpine /etc/issue; then \
|
|||||||
|
|
||||||
# glibc support for alpine x86_64 only
|
# glibc support for alpine x86_64 only
|
||||||
RUN if grep -i -q alpine /etc/issue && [ `arch` = "x86_64" ]; then \
|
RUN if grep -i -q alpine /etc/issue && [ `arch` = "x86_64" ]; then \
|
||||||
|
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
|
||||||
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-2.35-r0.apk \
|
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-2.35-r0.apk \
|
||||||
-O /tmp/glibc-2.35-r0.apk && \
|
-O /tmp/glibc-2.35-r0.apk && \
|
||||||
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-bin-2.35-r0.apk \
|
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-bin-2.35-r0.apk \
|
||||||
-O /tmp/glibc-bin-2.35-r0.apk && \
|
-O /tmp/glibc-bin-2.35-r0.apk && \
|
||||||
apk add --no-cache --allow-untrusted /tmp/glibc-2.35-r0.apk /tmp/glibc-bin-2.35-r0.apk && \
|
apk add --force-overwrite --no-cache /tmp/glibc-2.35-r0.apk /tmp/glibc-bin-2.35-r0.apk && \
|
||||||
rm -f /lib64/ld-linux-x86-64.so.2 && \
|
rm -f /lib64/ld-linux-x86-64.so.2 && \
|
||||||
ln -s /usr/glibc-compat/lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 && \
|
ln -s /usr/glibc-compat/lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 && \
|
||||||
rm -f /tmp/glibc-2.35-r0.apk && \
|
rm -f /tmp/glibc-2.35-r0.apk && \
|
||||||
@@ -151,6 +154,7 @@ RUN if [ ! $(getent group "$GF_GID") ]; then \
|
|||||||
|
|
||||||
COPY --from=go-src /tmp/grafana/bin/grafana* /tmp/grafana/bin/*/grafana* ./bin/
|
COPY --from=go-src /tmp/grafana/bin/grafana* /tmp/grafana/bin/*/grafana* ./bin/
|
||||||
COPY --from=js-src /tmp/grafana/public ./public
|
COPY --from=js-src /tmp/grafana/public ./public
|
||||||
|
COPY --from=go-src /tmp/grafana/LICENSE ./
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -173,7 +173,7 @@ build-docker-full-ubuntu: ## Build Docker image based on Ubuntu for development.
|
|||||||
DOCKER_BUILDKIT=1 \
|
DOCKER_BUILDKIT=1 \
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg BASE_IMAGE=ubuntu:20.04 \
|
--build-arg BASE_IMAGE=ubuntu:20.04 \
|
||||||
--build-arg GO_IMAGE=golang:1.19.4 \
|
--build-arg GO_IMAGE=golang:1.20.10 \
|
||||||
--tag grafana/grafana:dev-ubuntu .
|
--tag grafana/grafana:dev-ubuntu .
|
||||||
|
|
||||||
##@ Services
|
##@ Services
|
||||||
|
|||||||
@@ -262,6 +262,9 @@ rudderstack_sdk_url =
|
|||||||
# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config
|
# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config
|
||||||
rudderstack_config_url =
|
rudderstack_config_url =
|
||||||
|
|
||||||
|
# Intercom secret, optional, used to hash user_id before passing to Intercom via Rudderstack
|
||||||
|
intercom_secret =
|
||||||
|
|
||||||
# Application Insights connection string. Specify an URL string to enable this feature.
|
# Application Insights connection string. Specify an URL string to enable this feature.
|
||||||
application_insights_connection_string =
|
application_insights_connection_string =
|
||||||
|
|
||||||
@@ -501,6 +504,9 @@ sigv4_verbose_logging = false
|
|||||||
# Set to true to enable Azure authentication option for HTTP-based datasources
|
# Set to true to enable Azure authentication option for HTTP-based datasources
|
||||||
azure_auth_enabled = false
|
azure_auth_enabled = false
|
||||||
|
|
||||||
|
# Use email lookup in addition to the unique ID provided by the IdP
|
||||||
|
oauth_allow_insecure_email_lookup = false
|
||||||
|
|
||||||
#################################### Anonymous Auth ######################
|
#################################### Anonymous Auth ######################
|
||||||
[auth.anonymous]
|
[auth.anonymous]
|
||||||
# enable anonymous access
|
# enable anonymous access
|
||||||
@@ -532,6 +538,11 @@ allowed_organizations =
|
|||||||
role_attribute_path =
|
role_attribute_path =
|
||||||
role_attribute_strict = false
|
role_attribute_strict = false
|
||||||
allow_assign_grafana_admin = false
|
allow_assign_grafana_admin = false
|
||||||
|
skip_org_role_sync = false
|
||||||
|
tls_skip_verify_insecure = false
|
||||||
|
tls_client_cert =
|
||||||
|
tls_client_key =
|
||||||
|
tls_client_ca =
|
||||||
|
|
||||||
#################################### GitLab Auth #########################
|
#################################### GitLab Auth #########################
|
||||||
[auth.gitlab]
|
[auth.gitlab]
|
||||||
@@ -954,7 +965,8 @@ max_attempts = 3
|
|||||||
min_interval = 10s
|
min_interval = 10s
|
||||||
|
|
||||||
[unified_alerting.screenshots]
|
[unified_alerting.screenshots]
|
||||||
# Enable screenshots in notifications. This option requires the Grafana Image Renderer plugin.
|
# Enable screenshots in notifications. You must have either installed the Grafana image rendering
|
||||||
|
# plugin, or set up Grafana to use a remote rendering service.
|
||||||
# For more information on configuration options, refer to [rendering].
|
# For more information on configuration options, refer to [rendering].
|
||||||
capture = false
|
capture = false
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ apiVersion: 1
|
|||||||
# # evaluation - should be obtained via the API
|
# # evaluation - should be obtained via the API
|
||||||
# data:
|
# data:
|
||||||
# - refId: A
|
# - refId: A
|
||||||
# datasourceUid: "-100"
|
# datasourceUid: "__expr__"
|
||||||
# model:
|
# model:
|
||||||
# conditions:
|
# conditions:
|
||||||
# - evaluator:
|
# - evaluator:
|
||||||
@@ -40,7 +40,7 @@ apiVersion: 1
|
|||||||
# type: query
|
# type: query
|
||||||
# datasource:
|
# datasource:
|
||||||
# type: __expr__
|
# type: __expr__
|
||||||
# uid: "-100"
|
# uid: "__expr__"
|
||||||
# expression: 1==0
|
# expression: 1==0
|
||||||
# intervalMs: 1000
|
# intervalMs: 1000
|
||||||
# maxDataPoints: 43200
|
# maxDataPoints: 43200
|
||||||
@@ -66,6 +66,7 @@ apiVersion: 1
|
|||||||
# # route alerts
|
# # route alerts
|
||||||
# labels:
|
# labels:
|
||||||
# team: sre_team_1
|
# team: sre_team_1
|
||||||
|
# isPaused: false
|
||||||
|
|
||||||
# # List of alert rule UIDs that should be deleted
|
# # List of alert rule UIDs that should be deleted
|
||||||
# deleteRules:
|
# deleteRules:
|
||||||
|
|||||||
@@ -269,6 +269,9 @@
|
|||||||
# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config
|
# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config
|
||||||
;rudderstack_config_url =
|
;rudderstack_config_url =
|
||||||
|
|
||||||
|
# Intercom secret, optional, used to hash user_id before passing to Intercom via Rudderstack
|
||||||
|
;intercom_secret =
|
||||||
|
|
||||||
# Controls if the UI contains any links to user feedback forms
|
# Controls if the UI contains any links to user feedback forms
|
||||||
;feedback_links_enabled = true
|
;feedback_links_enabled = true
|
||||||
|
|
||||||
@@ -413,7 +416,7 @@
|
|||||||
# Set this value to automatically add new users to the provided organization (if auto_assign_org above is set to true)
|
# Set this value to automatically add new users to the provided organization (if auto_assign_org above is set to true)
|
||||||
;auto_assign_org_id = 1
|
;auto_assign_org_id = 1
|
||||||
|
|
||||||
# Default role new users will be automatically assigned (if disabled above is set to true)
|
# Default role new users will be automatically assigned (if auto_assign_org above is set to true)
|
||||||
;auto_assign_org_role = Viewer
|
;auto_assign_org_role = Viewer
|
||||||
|
|
||||||
# Require email validation before sign up completes
|
# Require email validation before sign up completes
|
||||||
@@ -505,6 +508,9 @@
|
|||||||
# Set to skip the organization role from JWT login and use system's role assignment instead.
|
# Set to skip the organization role from JWT login and use system's role assignment instead.
|
||||||
; skip_org_role_sync = false
|
; skip_org_role_sync = false
|
||||||
|
|
||||||
|
# Use email lookup in addition to the unique ID provided by the IdP
|
||||||
|
;oauth_allow_insecure_email_lookup = false
|
||||||
|
|
||||||
#################################### Anonymous Auth ######################
|
#################################### Anonymous Auth ######################
|
||||||
[auth.anonymous]
|
[auth.anonymous]
|
||||||
# enable anonymous access
|
# enable anonymous access
|
||||||
@@ -536,6 +542,7 @@
|
|||||||
;role_attribute_path =
|
;role_attribute_path =
|
||||||
;role_attribute_strict = false
|
;role_attribute_strict = false
|
||||||
;allow_assign_grafana_admin = false
|
;allow_assign_grafana_admin = false
|
||||||
|
;skip_org_role_sync = false
|
||||||
|
|
||||||
#################################### GitLab Auth #########################
|
#################################### GitLab Auth #########################
|
||||||
[auth.gitlab]
|
[auth.gitlab]
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ The following checklist/summary should give you a quick overview of what to ask/
|
|||||||
- Reviewed and approved?
|
- Reviewed and approved?
|
||||||
- All checks passed?
|
- All checks passed?
|
||||||
- Proper pull request title?
|
- Proper pull request title?
|
||||||
- Milestone assigned?
|
|
||||||
- Add to changelog/release notes?
|
- Add to changelog/release notes?
|
||||||
- Needs backporting?
|
- Needs backporting?
|
||||||
|
|
||||||
@@ -40,10 +39,18 @@ See [formatting guidelines](create-pull-request.md#formatting-guidelines) for mo
|
|||||||
|
|
||||||
### Assign a milestone
|
### Assign a milestone
|
||||||
|
|
||||||
A milestone **should** be added to every pull request. Several things in the Grafana release process requires at least pull requests to be in a milestone, for example [generating changelog/release notes](#include-in-changelog-and-release-notes).
|
Several things in the Grafana release process requires at least pull requests to be in a milestone, for example [generating changelog/release notes](#include-in-changelog-and-release-notes).
|
||||||
|
|
||||||
This makes it easier to track what changes go into a certain release. Without this information, release managers have to go through git commits which is not an efficient process.
|
This makes it easier to track what changes go into a certain release. Without this information, release managers have to go through git commits which is not an efficient process.
|
||||||
|
|
||||||
|
That being said, _you don't have to assign a milestone manually_ to a pull request.
|
||||||
|
Instead, when it is merged & closed then a bot will look for the most appropriate miletone and assign it to the pull request.
|
||||||
|
|
||||||
|
That milestone should always reflect the branch that the pull request is merged into.
|
||||||
|
For every major and minor release there is a milestone ending with `.x` (e.g. `10.0.x` for the 10.0.x releases).
|
||||||
|
Pull requests targetting `main` should use the `.x` milestone of the next minor (or major) version (you can find that version number inside the `package.json` file).
|
||||||
|
Backport pull requestss should use the version of the target branch (e.g. `9.4.x` for the `v9.4.x` branch).
|
||||||
|
|
||||||
### Include in changelog and release notes?
|
### Include in changelog and release notes?
|
||||||
|
|
||||||
At Grafana we generate the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md) and [release notes](https://grafana.com/docs/grafana/latest/release-notes/) based on merged pull requests. Including changes in the changelog/release notes is very important to provide a somewhat complete picture of what changes a Grafana release actually includes.
|
At Grafana we generate the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md) and [release notes](https://grafana.com/docs/grafana/latest/release-notes/) based on merged pull requests. Including changes in the changelog/release notes is very important to provide a somewhat complete picture of what changes a Grafana release actually includes.
|
||||||
@@ -78,15 +85,15 @@ The changelog/release notes are divided into sections and here's a description o
|
|||||||
|
|
||||||
**Features and enhancements:**
|
**Features and enhancements:**
|
||||||
|
|
||||||
Milestone assigned and labeled with `add to changelog` and any of the other section rules don't apply.
|
Labeled with `add to changelog` and any of the other section rules don't apply.
|
||||||
|
|
||||||
**Bug fixes:**
|
**Bug fixes:**
|
||||||
|
|
||||||
Milestone assigned and labeled with `add to changelog` and either labeled with `type/bug` or the pull request title contains `fix` or `fixes`.
|
Labeled with `add to changelog` and either labeled with `type/bug` or the pull request title contains `fix` or `fixes`.
|
||||||
|
|
||||||
**Plugin development fixes & changes:**
|
**Plugin development fixes & changes:**
|
||||||
|
|
||||||
Milestone assigned and labeled with `area/grafana/toolkit`, `area/grafana/ui` or `area/grafana/runtime`.
|
Labeled with `area/grafana/toolkit`, `area/grafana/ui` or `area/grafana/runtime`.
|
||||||
|
|
||||||
**Deprecations:**
|
**Deprecations:**
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,12 @@ function Foo(props: FooProps) {
|
|||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
// Use styles with className
|
// Use styles with className
|
||||||
}
|
}
|
||||||
```
|
|
||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => css({
|
const getStyles = (theme: GrafanaTheme2) =>
|
||||||
padding: theme.spacing(1,2)
|
css({
|
||||||
});
|
padding: theme.spacing(1, 2),
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
#### Get the theme object
|
#### Get the theme object
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
"label": "gdev-testdata",
|
"label": "gdev-testdata",
|
||||||
"description": "",
|
"description": "",
|
||||||
"type": "datasource",
|
"type": "datasource",
|
||||||
"pluginId": "testdata",
|
"pluginId": "testdata"
|
||||||
"pluginName": "TestData DB"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"__requires": [
|
"__requires": [
|
||||||
@@ -19,7 +18,7 @@
|
|||||||
{
|
{
|
||||||
"type": "datasource",
|
"type": "datasource",
|
||||||
"id": "testdata",
|
"id": "testdata",
|
||||||
"name": "TestData DB",
|
"name": "TestData",
|
||||||
"version": "1.0.0"
|
"version": "1.0.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
326
devenv/dev-dashboards/panel-heatmap/heatmap-x.json
Normal file
326
devenv/dev-dashboards/panel-heatmap/heatmap-x.json
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"builtIn": 1,
|
||||||
|
"datasource": {
|
||||||
|
"type": "grafana",
|
||||||
|
"uid": "-- Grafana --"
|
||||||
|
},
|
||||||
|
"enable": true,
|
||||||
|
"hide": true,
|
||||||
|
"iconColor": "rgba(0, 211, 255, 1)",
|
||||||
|
"name": "Annotations & Alerts",
|
||||||
|
"target": {
|
||||||
|
"limit": 100,
|
||||||
|
"matchAny": false,
|
||||||
|
"tags": [],
|
||||||
|
"type": "dashboard"
|
||||||
|
},
|
||||||
|
"type": "dashboard"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"editable": true,
|
||||||
|
"fiscalYearStartMonth": 0,
|
||||||
|
"graphTooltip": 0,
|
||||||
|
"id": 116,
|
||||||
|
"links": [],
|
||||||
|
"liveNow": false,
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "thresholds"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"align": "auto",
|
||||||
|
"displayMode": "auto",
|
||||||
|
"inspect": false
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 9,
|
||||||
|
"w": 10,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"options": {
|
||||||
|
"footer": {
|
||||||
|
"countRows": false,
|
||||||
|
"fields": "",
|
||||||
|
"reducer": [
|
||||||
|
"sum"
|
||||||
|
],
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
"showHeader": true
|
||||||
|
},
|
||||||
|
"pluginVersion": "9.4.0-pre",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"csvContent": "x,y1,y2\n1,8,12\n2,6,13\n3,7,9\n5,9,7\n6,5,9",
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"refId": "A",
|
||||||
|
"scenarioId": "csv_content"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Raw heatmap rows",
|
||||||
|
"type": "table"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "datasource",
|
||||||
|
"uid": "-- Dashboard --"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 9,
|
||||||
|
"w": 14,
|
||||||
|
"x": 10,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"id": 4,
|
||||||
|
"options": {
|
||||||
|
"calculate": false,
|
||||||
|
"cellGap": 1,
|
||||||
|
"color": {
|
||||||
|
"exponent": 0.5,
|
||||||
|
"fill": "dark-orange",
|
||||||
|
"mode": "scheme",
|
||||||
|
"reverse": false,
|
||||||
|
"scale": "exponential",
|
||||||
|
"scheme": "Oranges",
|
||||||
|
"steps": 64
|
||||||
|
},
|
||||||
|
"exemplars": {
|
||||||
|
"color": "rgba(255,0,255,0.7)"
|
||||||
|
},
|
||||||
|
"filterValues": {
|
||||||
|
"le": 1e-9
|
||||||
|
},
|
||||||
|
"legend": {
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
"rowsFrame": {
|
||||||
|
"layout": "auto"
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"show": true,
|
||||||
|
"yHistogram": false
|
||||||
|
},
|
||||||
|
"yAxis": {
|
||||||
|
"axisPlacement": "left",
|
||||||
|
"reverse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "9.4.0-pre",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "datasource",
|
||||||
|
"uid": "-- Dashboard --"
|
||||||
|
},
|
||||||
|
"panelId": 2,
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Row heatmap",
|
||||||
|
"type": "heatmap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "thresholds"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"align": "auto",
|
||||||
|
"displayMode": "auto",
|
||||||
|
"inspect": false
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 10,
|
||||||
|
"x": 0,
|
||||||
|
"y": 9
|
||||||
|
},
|
||||||
|
"id": 5,
|
||||||
|
"options": {
|
||||||
|
"footer": {
|
||||||
|
"countRows": false,
|
||||||
|
"fields": "",
|
||||||
|
"reducer": [
|
||||||
|
"sum"
|
||||||
|
],
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
"showHeader": true
|
||||||
|
},
|
||||||
|
"pluginVersion": "9.4.0-pre",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"csvContent": "x,y,count\n1,4,10\n1,6,11\n2,5,30\n2,4,22\n3,6,17",
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"refId": "A",
|
||||||
|
"scenarioId": "csv_content"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Raw heatmap cells",
|
||||||
|
"type": "table"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "datasource",
|
||||||
|
"uid": "-- Dashboard --"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 14,
|
||||||
|
"x": 10,
|
||||||
|
"y": 9
|
||||||
|
},
|
||||||
|
"id": 6,
|
||||||
|
"options": {
|
||||||
|
"calculate": false,
|
||||||
|
"cellGap": 1,
|
||||||
|
"color": {
|
||||||
|
"exponent": 0.5,
|
||||||
|
"fill": "dark-orange",
|
||||||
|
"mode": "scheme",
|
||||||
|
"reverse": false,
|
||||||
|
"scale": "exponential",
|
||||||
|
"scheme": "Oranges",
|
||||||
|
"steps": 64
|
||||||
|
},
|
||||||
|
"exemplars": {
|
||||||
|
"color": "rgba(255,0,255,0.7)"
|
||||||
|
},
|
||||||
|
"filterValues": {
|
||||||
|
"le": 1e-9
|
||||||
|
},
|
||||||
|
"legend": {
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
"rowsFrame": {
|
||||||
|
"layout": "auto"
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"show": true,
|
||||||
|
"yHistogram": false
|
||||||
|
},
|
||||||
|
"yAxis": {
|
||||||
|
"axisPlacement": "left",
|
||||||
|
"reverse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pluginVersion": "9.4.0-pre",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "datasource",
|
||||||
|
"uid": "-- Dashboard --"
|
||||||
|
},
|
||||||
|
"panelId": 5,
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Cells heatmap",
|
||||||
|
"type": "heatmap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"revision": 1,
|
||||||
|
"schemaVersion": 37,
|
||||||
|
"style": "dark",
|
||||||
|
"tags": [],
|
||||||
|
"templating": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-6h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timepicker": {},
|
||||||
|
"timezone": "",
|
||||||
|
"title": "Heatmap X axis",
|
||||||
|
"uid": "5Y0jv6pVz",
|
||||||
|
"version": 3,
|
||||||
|
"weekStart": ""
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1156,11 +1156,195 @@
|
|||||||
],
|
],
|
||||||
"title": "Boolean On/Off",
|
"title": "Boolean On/Off",
|
||||||
"type": "timeseries"
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"log": 2,
|
||||||
|
"type": "log"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"max": 150,
|
||||||
|
"min": 0,
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 8,
|
||||||
|
"x": 0,
|
||||||
|
"y": 31
|
||||||
|
},
|
||||||
|
"id": 16,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"refId": "A",
|
||||||
|
"scenarioId": "csv_metric_values",
|
||||||
|
"stringInput": "1,20,90.5,30,5,0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Ignore invalid min/max opts when log scale",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "palette-classic"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
|
"gradientMode": "none",
|
||||||
|
"hideFrom": {
|
||||||
|
"legend": false,
|
||||||
|
"tooltip": false,
|
||||||
|
"viz": false
|
||||||
|
},
|
||||||
|
"lineInterpolation": "linear",
|
||||||
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"log": 2,
|
||||||
|
"type": "symlog"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
|
"stacking": {
|
||||||
|
"group": "A",
|
||||||
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"max": 200,
|
||||||
|
"min": -15,
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 8,
|
||||||
|
"x": 8,
|
||||||
|
"y": 31
|
||||||
|
},
|
||||||
|
"id": 17,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"mode": "single",
|
||||||
|
"sort": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "testdata",
|
||||||
|
"uid": "PD8C576611E62080A"
|
||||||
|
},
|
||||||
|
"refId": "A",
|
||||||
|
"scenarioId": "csv_metric_values",
|
||||||
|
"stringInput": "1,20,90.5,30,5,0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Neg min opt with symlog scale",
|
||||||
|
"type": "timeseries"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"refresh": false,
|
"refresh": "",
|
||||||
"revision": 1,
|
"revision": 1,
|
||||||
"schemaVersion": 37,
|
"schemaVersion": 38,
|
||||||
"style": "dark",
|
"style": "dark",
|
||||||
"tags": [
|
"tags": [
|
||||||
"gdev",
|
"gdev",
|
||||||
@@ -1191,6 +1375,6 @@
|
|||||||
"timezone": "",
|
"timezone": "",
|
||||||
"title": "Panel Tests - Graph NG - Y axis ticks",
|
"title": "Panel Tests - Graph NG - Y axis ticks",
|
||||||
"uid": "29Yjn62Gk",
|
"uid": "29Yjn62Gk",
|
||||||
"version": 1,
|
"version": 13,
|
||||||
"weekStart": ""
|
"weekStart": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -299,7 +299,10 @@
|
|||||||
"revision": 1,
|
"revision": 1,
|
||||||
"schemaVersion": 37,
|
"schemaVersion": 37,
|
||||||
"style": "dark",
|
"style": "dark",
|
||||||
"tags": [],
|
"tags": [
|
||||||
|
"gdev",
|
||||||
|
"transform"
|
||||||
|
],
|
||||||
"templating": {
|
"templating": {
|
||||||
"list": []
|
"list": []
|
||||||
},
|
},
|
||||||
@@ -309,7 +312,7 @@
|
|||||||
},
|
},
|
||||||
"timepicker": {},
|
"timepicker": {},
|
||||||
"timezone": "",
|
"timezone": "",
|
||||||
"title": "Test extractFields JSON",
|
"title": "Transforms - Test extractFields JSON",
|
||||||
"uid": "pD4vPYhVz",
|
"uid": "pD4vPYhVz",
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"weekStart": ""
|
"weekStart": ""
|
||||||
|
|||||||
171
devenv/dev-dashboards/transforms/filter.json
Normal file
171
devenv/dev-dashboards/transforms/filter.json
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"builtIn": 1,
|
||||||
|
"datasource": {
|
||||||
|
"type": "grafana",
|
||||||
|
"uid": "-- Grafana --"
|
||||||
|
},
|
||||||
|
"enable": true,
|
||||||
|
"hide": true,
|
||||||
|
"iconColor": "rgba(0, 211, 255, 1)",
|
||||||
|
"name": "Annotations & Alerts",
|
||||||
|
"target": {
|
||||||
|
"limit": 100,
|
||||||
|
"matchAny": false,
|
||||||
|
"tags": [],
|
||||||
|
"type": "dashboard"
|
||||||
|
},
|
||||||
|
"type": "dashboard"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"editable": true,
|
||||||
|
"fiscalYearStartMonth": 0,
|
||||||
|
"graphTooltip": 0,
|
||||||
|
"id": 1394,
|
||||||
|
"links": [],
|
||||||
|
"liveNow": false,
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"uid": "PD8C576611E62080A",
|
||||||
|
"type": "testdata"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"align": "auto",
|
||||||
|
"cellOptions": {
|
||||||
|
"type": "auto"
|
||||||
|
},
|
||||||
|
"inspect": false
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"mode": "thresholds"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 9,
|
||||||
|
"w": 12,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"id": 2,
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"scenarioId": "csv_content",
|
||||||
|
"refId": "A",
|
||||||
|
"datasource": {
|
||||||
|
"uid": "PD8C576611E62080A",
|
||||||
|
"type": "testdata"
|
||||||
|
},
|
||||||
|
"csvContent": "AAA\n1\n2\n3\n4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"scenarioId": "csv_content",
|
||||||
|
"refId": "B",
|
||||||
|
"datasource": {
|
||||||
|
"uid": "PD8C576611E62080A",
|
||||||
|
"type": "testdata"
|
||||||
|
},
|
||||||
|
"csvContent": "BBB\n1\n2\n3\n4\n",
|
||||||
|
"hide": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Transformer query filters",
|
||||||
|
"type": "table",
|
||||||
|
"transformations": [
|
||||||
|
{
|
||||||
|
"id": "reduce",
|
||||||
|
"options": {
|
||||||
|
"reducers": [
|
||||||
|
"min"
|
||||||
|
],
|
||||||
|
"mode": "reduceFields",
|
||||||
|
"includeTimeField": false
|
||||||
|
},
|
||||||
|
"filter": {
|
||||||
|
"id": "byRefId",
|
||||||
|
"options": "A"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "reduce",
|
||||||
|
"options": {
|
||||||
|
"reducers": [
|
||||||
|
"max"
|
||||||
|
],
|
||||||
|
"mode": "reduceFields",
|
||||||
|
"includeTimeField": false
|
||||||
|
},
|
||||||
|
"filter": {
|
||||||
|
"id": "byRefId",
|
||||||
|
"options": "B"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "concatenate",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "organize",
|
||||||
|
"options": {
|
||||||
|
"excludeByName": {},
|
||||||
|
"indexByName": {},
|
||||||
|
"renameByName": {
|
||||||
|
"AAA": "Min from Query A",
|
||||||
|
"BBB": "Max from Query B"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"showHeader": true,
|
||||||
|
"footer": {
|
||||||
|
"show": false,
|
||||||
|
"reducer": [
|
||||||
|
"sum"
|
||||||
|
],
|
||||||
|
"countRows": false,
|
||||||
|
"fields": ""
|
||||||
|
},
|
||||||
|
"frameIndex": 0
|
||||||
|
},
|
||||||
|
"pluginVersion": "9.4.0-pre"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"schemaVersion": 37,
|
||||||
|
"style": "dark",
|
||||||
|
"tags": [
|
||||||
|
"gdev",
|
||||||
|
"transform"
|
||||||
|
],
|
||||||
|
"templating": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-6h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timepicker": {},
|
||||||
|
"timezone": "",
|
||||||
|
"title": "Transforms - Filters",
|
||||||
|
"uid": "fGWBVW4k"
|
||||||
|
}
|
||||||
@@ -624,7 +624,7 @@
|
|||||||
},
|
},
|
||||||
"timepicker": {},
|
"timepicker": {},
|
||||||
"timezone": "",
|
"timezone": "",
|
||||||
"title": "Join by field",
|
"title": "Transforms - Join by field",
|
||||||
"uid": "gw0K4rmVz",
|
"uid": "gw0K4rmVz",
|
||||||
"version": 6,
|
"version": 6,
|
||||||
"weekStart": ""
|
"weekStart": ""
|
||||||
|
|||||||
@@ -347,7 +347,7 @@
|
|||||||
},
|
},
|
||||||
"timepicker": {},
|
"timepicker": {},
|
||||||
"timezone": "",
|
"timezone": "",
|
||||||
"title": "Join by labels",
|
"title": "Transforms - Join by labels",
|
||||||
"uid": "FVl-9CR4z",
|
"uid": "FVl-9CR4z",
|
||||||
"version": 10,
|
"version": 10,
|
||||||
"weekStart": ""
|
"weekStart": ""
|
||||||
|
|||||||
@@ -521,7 +521,10 @@
|
|||||||
],
|
],
|
||||||
"schemaVersion": 37,
|
"schemaVersion": 37,
|
||||||
"style": "dark",
|
"style": "dark",
|
||||||
"tags": ["devenv"],
|
"tags": [
|
||||||
|
"gdev",
|
||||||
|
"transform"
|
||||||
|
],
|
||||||
"templating": {
|
"templating": {
|
||||||
"list": []
|
"list": []
|
||||||
},
|
},
|
||||||
@@ -531,6 +534,6 @@
|
|||||||
},
|
},
|
||||||
"timepicker": {},
|
"timepicker": {},
|
||||||
"timezone": "",
|
"timezone": "",
|
||||||
"title": "Reuse dashboard queries",
|
"title": "Transforms - Reuse dashboard queries",
|
||||||
"uid": "fYGWTVW4k"
|
"uid": "fYGWTVW4k"
|
||||||
}
|
}
|
||||||
|
|||||||
12
devenv/docker/ha-test-unified-alerting/Dockerfile
Normal file
12
devenv/docker/ha-test-unified-alerting/Dockerfile
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
FROM golang:1.19
|
||||||
|
|
||||||
|
ADD webhook-listener.go /go/src/webhook/webhook-listener.go
|
||||||
|
|
||||||
|
WORKDIR /go/src/webhook
|
||||||
|
|
||||||
|
RUN mkdir /tmp/logs
|
||||||
|
RUN go build -o /bin webhook-listener.go
|
||||||
|
|
||||||
|
ENV PORT 8080
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/bin/webhook-listener" ]
|
||||||
@@ -32,7 +32,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- VIRTUAL_HOST=prometheus.loc
|
- VIRTUAL_HOST=prometheus.loc
|
||||||
ports:
|
ports:
|
||||||
- 909
|
- 9090
|
||||||
nginx-proxy:
|
nginx-proxy:
|
||||||
image: jwilder/nginx-proxy
|
image: jwilder/nginx-proxy
|
||||||
ports:
|
ports:
|
||||||
@@ -43,48 +43,53 @@ services:
|
|||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
grafana1:
|
grafana1:
|
||||||
image: grafana/grafana:dev
|
extends:
|
||||||
volumes:
|
file: ./grafana-service.yml
|
||||||
- ./grafana/provisioning/:/etc/grafana/provisioning/
|
service: grafana
|
||||||
environment:
|
|
||||||
- VIRTUAL_HOST=grafana.loc
|
|
||||||
- GF_FEATURE_TOGGLES_ENABLE=ngalert
|
|
||||||
- GF_UNIFIED_ALERTING_HA_PEERS=ha-test-unified-alerting_grafana2_1:9094,ha-test-unified-alerting_grafana1_1:9094
|
|
||||||
- GF_SERVER_ROOT_URL=http://grafana.loc
|
|
||||||
- GF_DATABASE_NAME=grafana
|
|
||||||
- GF_DATABASE_USER=grafana
|
|
||||||
- GF_DATABASE_PASSWORD=password
|
|
||||||
- GF_DATABASE_TYPE=mysql
|
|
||||||
- GF_DATABASE_HOST=db:3306
|
|
||||||
- GF_DATABASE_MAX_OPEN_CONN=300
|
|
||||||
- GF_SESSION_PROVIDER=mysql
|
|
||||||
- GF_SESSION_PROVIDER_CONFIG=grafana:password@tcp(db:3306)/grafana?allowNativePasswords=true
|
|
||||||
ports:
|
ports:
|
||||||
- 3010:3000
|
- 3010:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|
||||||
grafana2:
|
grafana2:
|
||||||
image: grafana/grafana:dev
|
extends:
|
||||||
volumes:
|
file: ./grafana-service.yml
|
||||||
- ./grafana/provisioning/:/etc/grafana/provisioning/
|
service: grafana
|
||||||
environment:
|
|
||||||
- VIRTUAL_HOST=grafana.loc
|
|
||||||
- GF_FEATURE_TOGGLES_ENABLE=ngalert
|
|
||||||
- GF_UNIFIED_ALERTING_HA_PEERS=ha-test-unified-alerting_grafana2_1:9094,ha-test-unified-alerting_grafana1_1:9094
|
|
||||||
- GF_SERVER_ROOT_URL=http://grafana.loc
|
|
||||||
- GF_DATABASE_NAME=grafana
|
|
||||||
- GF_DATABASE_USER=grafana
|
|
||||||
- GF_DATABASE_PASSWORD=password
|
|
||||||
- GF_DATABASE_TYPE=mysql
|
|
||||||
- GF_DATABASE_HOST=db:3306
|
|
||||||
- GF_DATABASE_MAX_OPEN_CONN=300
|
|
||||||
- GF_SESSION_PROVIDER=mysql
|
|
||||||
- GF_SESSION_PROVIDER_CONFIG=grafana:password@tcp(db:3306)/grafana?allowNativePasswords=true
|
|
||||||
ports:
|
ports:
|
||||||
- 3020:3000
|
- 3020:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
grafana1:
|
||||||
|
condition: service_healthy
|
||||||
|
grafana3:
|
||||||
|
extends:
|
||||||
|
file: ./grafana-service.yml
|
||||||
|
service: grafana
|
||||||
|
ports:
|
||||||
|
- 3030:3000
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
grafana2:
|
||||||
|
condition: service_healthy
|
||||||
|
grafana4:
|
||||||
|
extends:
|
||||||
|
file: ./grafana-service.yml
|
||||||
|
service: grafana
|
||||||
|
ports:
|
||||||
|
- 3040:3000
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
grafana3:
|
||||||
|
condition: service_healthy
|
||||||
|
webhook:
|
||||||
|
image: webhook-receiver
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "18081:8080"
|
||||||
|
volumes:
|
||||||
|
- "./logs/webhook:/tmp/logs:rw"
|
||||||
|
|||||||
23
devenv/docker/ha-test-unified-alerting/grafana-service.yml
Normal file
23
devenv/docker/ha-test-unified-alerting/grafana-service.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
services:
|
||||||
|
grafana:
|
||||||
|
image: grafana/grafana-dev:3a22eba17f23b18faa27436ab2f9c3ea977b550b
|
||||||
|
volumes:
|
||||||
|
- ./grafana/provisioning/:/etc/grafana/provisioning/
|
||||||
|
environment:
|
||||||
|
- VIRTUAL_HOST=grafana.loc
|
||||||
|
- GF_FEATURE_TOGGLES_ENABLE=ngalert
|
||||||
|
- GF_UNIFIED_ALERTING_HA_PEERS=ha-test-unified-alerting-grafana2-1:9094,ha-test-unified-alerting-grafana1-1:9094,ha-test-unified-alerting-grafana3-1:9094,ha-test-unified-alerting-grafana4-1:9094
|
||||||
|
- GF_SERVER_ROOT_URL=http://grafana.loc
|
||||||
|
- GF_DATABASE_NAME=grafana
|
||||||
|
- GF_DATABASE_USER=grafana
|
||||||
|
- GF_DATABASE_PASSWORD=password
|
||||||
|
- GF_DATABASE_TYPE=mysql
|
||||||
|
- GF_DATABASE_HOST=db:3306
|
||||||
|
- GF_DATABASE_MAX_OPEN_CONN=300
|
||||||
|
- GF_SESSION_PROVIDER=mysql
|
||||||
|
- GF_SESSION_PROVIDER_CONFIG=grafana:password@tcp(db:3306)/grafana?allowNativePasswords=true
|
||||||
|
healthcheck:
|
||||||
|
test: timeout 10s bash -c ':> /dev/tcp/127.0.0.1/3000' || exit 1
|
||||||
|
interval: 5s
|
||||||
|
timeout: 15s
|
||||||
|
retries: 3
|
||||||
181
devenv/docker/ha-test-unified-alerting/webhook-listener.go
Normal file
181
devenv/docker/ha-test-unified-alerting/webhook-listener.go
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"path/filepath"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
fingerprints = make(Fingerprints)
|
||||||
|
mu sync.Mutex
|
||||||
|
waitSeconds int
|
||||||
|
logFile bool
|
||||||
|
logFileName = filepath.Join(os.TempDir(), "/logs/webhook-listener.log")
|
||||||
|
dumpDir = filepath.Join(os.TempDir(), "/logs/dumps")
|
||||||
|
)
|
||||||
|
|
||||||
|
type Alert struct {
|
||||||
|
Fingerprint string `json:"fingerprint"`
|
||||||
|
StartsAt time.Time `json:"startsAt"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
Receiver string `json:"receiver"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
Alerts []Alert `json:"alerts"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fingerprints keeps track of the number of alerts received
|
||||||
|
// by fingerprint and StartsAt time.
|
||||||
|
type Fingerprints map[string]map[time.Time]tracker
|
||||||
|
|
||||||
|
type tracker struct {
|
||||||
|
Updates int `json:"updates"`
|
||||||
|
Statuses []string `json:"statuses"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateFingerprints(v Data) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
for _, alert := range v.Alerts {
|
||||||
|
m, ok := fingerprints[alert.Fingerprint]
|
||||||
|
if !ok {
|
||||||
|
m = make(map[time.Time]tracker)
|
||||||
|
}
|
||||||
|
|
||||||
|
t, ok := m[alert.StartsAt]
|
||||||
|
if !ok {
|
||||||
|
t = tracker{
|
||||||
|
Updates: 0,
|
||||||
|
Statuses: []string{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Updates += 1
|
||||||
|
t.Statuses = append(t.Statuses, alert.Status)
|
||||||
|
|
||||||
|
m[alert.StartsAt] = t
|
||||||
|
fingerprints[alert.Fingerprint] = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseFlags() {
|
||||||
|
flag.BoolVar(&logFile, "log-file", true, "Whether to log to file")
|
||||||
|
flag.IntVar(&waitSeconds, "wait-seconds", 0, "The number of seconds to wait before sending an HTTP response")
|
||||||
|
flag.Parse()
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveDump(data []byte) {
|
||||||
|
if !logFile {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(data) == 0 {
|
||||||
|
fmt.Println("empty dump - not saving")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ts := time.Now().UnixNano()
|
||||||
|
name := path.Join(dumpDir, fmt.Sprintf("%d.json", ts))
|
||||||
|
for i := 1; i <= 1000; i++ {
|
||||||
|
if _, err := os.Stat(name); os.IsNotExist(err) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
name = path.Join(dumpDir, fmt.Sprintf("%d_%04d.json", ts, i))
|
||||||
|
}
|
||||||
|
log.Printf("saving dump to %s", name)
|
||||||
|
err := os.WriteFile(name, data, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("cannot save to file %s: %s\n", name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
parseFlags()
|
||||||
|
|
||||||
|
_, err := os.Stat(dumpDir)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
err = os.MkdirAll(dumpDir, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicf("can't create directory '%s'", dumpDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if logFile {
|
||||||
|
//create your file with desired read/write permissions
|
||||||
|
f, err := os.OpenFile(logFileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
log.SetOutput(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
waitDuration := time.Duration(waitSeconds) * time.Second
|
||||||
|
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
|
||||||
|
|
||||||
|
writer.WriteHeader(http.StatusOK)
|
||||||
|
writer.Write([]byte(landingPage))
|
||||||
|
})
|
||||||
|
|
||||||
|
http.HandleFunc("/listen", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
log.Printf("got submission from: %s\n", r.RemoteAddr)
|
||||||
|
b, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
saveDump(b)
|
||||||
|
v := Data{}
|
||||||
|
if err := json.Unmarshal(b, &v); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("receiver: %s, status: %s\n", v.Receiver, v.Status)
|
||||||
|
updateFingerprints(v)
|
||||||
|
<-time.After(waitDuration)
|
||||||
|
})
|
||||||
|
http.HandleFunc("/fingerprints", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
b, err := func() ([]byte, error) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
return json.Marshal(fingerprints)
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.Write(b)
|
||||||
|
})
|
||||||
|
log.Println("Listening")
|
||||||
|
log.Printf("Wait Duration %v\n", waitDuration)
|
||||||
|
http.ListenAndServe("0.0.0.0:8080", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
const landingPage = `
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Webhook listener</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Webhook Listener<h1>
|
||||||
|
|
||||||
|
<p> For setup, please point your webhook configuration to the "/listen" endpoint. </p>
|
||||||
|
<p> For debugging, please use the "/fingerprints" endpoint. </p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`
|
||||||
@@ -184,6 +184,13 @@ local dashboard = grafana.dashboard;
|
|||||||
id: 0,
|
id: 0,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
dashboard.new('filter', import '../dev-dashboards/transforms/filter.json') +
|
||||||
|
resource.addMetadata('folder', 'dev-dashboards') +
|
||||||
|
{
|
||||||
|
spec+: {
|
||||||
|
id: 0,
|
||||||
|
}
|
||||||
|
},
|
||||||
dashboard.new('gauge-multi-series', import '../dev-dashboards/panel-gauge/gauge-multi-series.json') +
|
dashboard.new('gauge-multi-series', import '../dev-dashboards/panel-gauge/gauge-multi-series.json') +
|
||||||
resource.addMetadata('folder', 'dev-dashboards') +
|
resource.addMetadata('folder', 'dev-dashboards') +
|
||||||
{
|
{
|
||||||
@@ -296,6 +303,13 @@ local dashboard = grafana.dashboard;
|
|||||||
id: 0,
|
id: 0,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
dashboard.new('heatmap-x', import '../dev-dashboards/panel-heatmap/heatmap-x.json') +
|
||||||
|
resource.addMetadata('folder', 'dev-dashboards') +
|
||||||
|
{
|
||||||
|
spec+: {
|
||||||
|
id: 0,
|
||||||
|
}
|
||||||
|
},
|
||||||
dashboard.new('histogram_tests', import '../dev-dashboards/panel-histogram/histogram_tests.json') +
|
dashboard.new('histogram_tests', import '../dev-dashboards/panel-histogram/histogram_tests.json') +
|
||||||
resource.addMetadata('folder', 'dev-dashboards') +
|
resource.addMetadata('folder', 'dev-dashboards') +
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,28 +1,8 @@
|
|||||||
.PHONY: pull docs docs-quick docs-no-pull docs-test docs-local-static
|
.ONESHELL:
|
||||||
|
.DELETE_ON_ERROR:
|
||||||
|
export SHELL := bash
|
||||||
|
export SHELLOPTS := pipefail:errexit
|
||||||
|
MAKEFLAGS += --warn-undefined-variables
|
||||||
|
MAKEFLAGS += --no-builtin-rule
|
||||||
|
|
||||||
PODMAN = $(shell if command -v podman &>/dev/null; then echo podman; else echo docker; fi)
|
include docs.mk
|
||||||
IMAGE = grafana/docs-base:latest
|
|
||||||
CONTENT_PATH = /hugo/content/docs/grafana/next
|
|
||||||
LOCAL_STATIC_PATH = ../../website/static
|
|
||||||
PORT = 3002:3002
|
|
||||||
|
|
||||||
pull:
|
|
||||||
$(PODMAN) pull $(IMAGE)
|
|
||||||
|
|
||||||
docs: pull
|
|
||||||
$(PODMAN) run -v $(shell pwd)/sources:$(CONTENT_PATH):Z -p $(PORT) --rm -it $(IMAGE) /bin/bash -c "make server"
|
|
||||||
|
|
||||||
docs-preview: pull
|
|
||||||
$(PODMAN) run -v $(shell pwd)/sources:$(CONTENT_PATH):Z -p $(PORT) --rm -it $(IMAGE) /bin/bash -c "make server BUILD_DRAFTS=true"
|
|
||||||
|
|
||||||
docs-no-pull:
|
|
||||||
$(PODMAN) run -v $(shell pwd)/sources:$(CONTENT_PATH):Z -p $(PORT) --rm -it $(IMAGE) /bin/bash -c "make server"
|
|
||||||
|
|
||||||
docs-test: pull
|
|
||||||
$(PODMAN) run -v $(shell pwd)/sources:$(CONTENT_PATH):Z --rm -it $(IMAGE) /bin/bash -c 'make prod'
|
|
||||||
|
|
||||||
# expects that you have grafana/website checked out in same path as the grafana repo.
|
|
||||||
docs-local-static: pull
|
|
||||||
if [ ! -d "$(LOCAL_STATIC_PATH)" ]; then echo "local path (website project) $(LOCAL_STATIC_PATH) not found"]; exit 1; fi
|
|
||||||
$(PODMAN) run -v $(shell pwd)/sources:$(CONTENT_PATH):Z \
|
|
||||||
-v $(shell pwd)/$(LOCAL_STATIC_PATH):/hugo/static:Z -p $(PORT) --rm -it $(IMAGE)
|
|
||||||
|
|||||||
@@ -1,16 +1,21 @@
|
|||||||
# Building the docs locally
|
# Building the docs locally
|
||||||
|
|
||||||
When you contribute to documentation, it is a good practice to build the docs on your local machine to make sure your changes appear as you expect. This README explains the process for doing that.
|
When you contribute to documentation, it's a good practice to build the docs on your local machine to make sure your changes appear as you expect. This README explains the process for doing that.
|
||||||
|
|
||||||
|
To build a local version, you need to run a process in a Docker container.
|
||||||
|
Grafana periodically updates the Docker image, [`docs-base`](https://hub.docker.com/r/grafana/docs-base), to update the styling of the Docs.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
Docker >= 2.1.0.3
|
- Docker >= 2.1.0.3
|
||||||
Yarn >= 1.22.4
|
- Yarn >= 1.22.4
|
||||||
|
|
||||||
## Build the doc site
|
## Build the doc site
|
||||||
|
|
||||||
|
First, make sure the Docker daemon is running on your machine. Then, follow these steps:
|
||||||
|
|
||||||
1. On the command line, first change to the docs folder: `cd docs`.
|
1. On the command line, first change to the docs folder: `cd docs`.
|
||||||
1. Run `make docs`. This launches a preview of the website with the current grafana docs at `http://localhost:3002/docs/grafana/next/` which will refresh automatically when changes are made to content in the `sources` directory.
|
1. Run `make docs`. This launches a preview of the website with the current grafana docs at `http://localhost:3002/docs/grafana/latest/` which will refresh automatically when changes are made to content in the `sources` directory.
|
||||||
|
|
||||||
If you have the grafana/website repo checked out in the same directory as the grafana repo, then you can run `make docs-local-static` to use local assets (such as images).
|
If you have the grafana/website repo checked out in the same directory as the grafana repo, then you can run `make docs-local-static` to use local assets (such as images).
|
||||||
|
|
||||||
@@ -52,7 +57,7 @@ To specify different menu text from the page title, use the front matter paramet
|
|||||||
|
|
||||||
### Add images
|
### Add images
|
||||||
|
|
||||||
Images are currently hosted in the grafana/website repo.
|
Please see our help documentation on [Image, diagram, and screenshot guidelines](https://grafana.com/docs/writers-toolkit/writing-guide/image-guidelines/) for comprehensive information.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
117
docs/docs.mk
Normal file
117
docs/docs.mk
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# The source of this file is https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/docs.mk.
|
||||||
|
# 4.0.0 (2023-06-06)
|
||||||
|
include variables.mk
|
||||||
|
-include variables.mk.local
|
||||||
|
|
||||||
|
.ONESHELL:
|
||||||
|
.DELETE_ON_ERROR:
|
||||||
|
export SHELL := bash
|
||||||
|
export SHELLOPTS := pipefail:errexit
|
||||||
|
MAKEFLAGS += --warn-undefined-variables
|
||||||
|
MAKEFLAGS += --no-builtin-rule
|
||||||
|
|
||||||
|
.DEFAULT_GOAL: help
|
||||||
|
|
||||||
|
# Adapted from https://www.thapaliya.com/en/writings/well-documented-makefiles/
|
||||||
|
.PHONY: help
|
||||||
|
help: ## Display this help.
|
||||||
|
help:
|
||||||
|
@awk 'BEGIN { \
|
||||||
|
FS = ": ##"; \
|
||||||
|
printf "Usage:\n make <target>\n\nTargets:\n" \
|
||||||
|
} \
|
||||||
|
/^[a-zA-Z0-9_\.\-\/%]+: ##/ { printf " %-15s %s\n", $$1, $$2 }' \
|
||||||
|
$(MAKEFILE_LIST)
|
||||||
|
|
||||||
|
GIT_ROOT := $(shell git rev-parse --show-toplevel)
|
||||||
|
|
||||||
|
PODMAN := $(shell if command -v podman >/dev/null 2>&1; then echo podman; else echo docker; fi)
|
||||||
|
|
||||||
|
ifeq ($(PROJECTS),)
|
||||||
|
$(error "PROJECTS variable must be defined in variables.mk")
|
||||||
|
endif
|
||||||
|
|
||||||
|
# First project is considered the primary one used for doc-validator.
|
||||||
|
PRIMARY_PROJECT := $(subst /,-,$(firstword $(subst :, ,$(firstword $(PROJECTS)))))
|
||||||
|
|
||||||
|
# Name for the container.
|
||||||
|
ifeq ($(origin DOCS_CONTAINER), undefined)
|
||||||
|
export DOCS_CONTAINER := $(PRIMARY_PROJECT)-docs
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Host port to publish container port to.
|
||||||
|
ifeq ($(origin DOCS_HOST_PORT), undefined)
|
||||||
|
export DOCS_HOST_PORT := 3002
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Container image used to perform Hugo build.
|
||||||
|
ifeq ($(origin DOCS_IMAGE), undefined)
|
||||||
|
export DOCS_IMAGE := grafana/docs-base:latest
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Container image used for doc-validator linting.
|
||||||
|
ifeq ($(origin DOC_VALIDATOR_IMAGE), undefined)
|
||||||
|
export DOC_VALIDATOR_IMAGE := grafana/doc-validator:latest
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Container image used for vale linting.
|
||||||
|
ifeq ($(origin VALE_IMAGE), undefined)
|
||||||
|
export VALE_IMAGE := grafana/vale:latest
|
||||||
|
endif
|
||||||
|
|
||||||
|
# PATH-like list of directories within which to find projects.
|
||||||
|
# If all projects are checked out into the same directory, ~/repos/ for example, then the default should work.
|
||||||
|
ifeq ($(origin REPOS_PATH), undefined)
|
||||||
|
export REPOS_PATH := $(realpath $(GIT_ROOT)/..)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# How to treat Hugo relref errors.
|
||||||
|
ifeq ($(origin HUGO_REFLINKSERRORLEVEL), undefined)
|
||||||
|
export HUGO_REFLINKSERRORLEVEL := WARNING
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: docs-rm
|
||||||
|
docs-rm: ## Remove the docs container.
|
||||||
|
$(PODMAN) rm -f $(DOCS_CONTAINER)
|
||||||
|
|
||||||
|
.PHONY: docs-pull
|
||||||
|
docs-pull: ## Pull documentation base image.
|
||||||
|
$(PODMAN) pull -q $(DOCS_IMAGE)
|
||||||
|
|
||||||
|
make-docs: ## Fetch the latest make-docs script.
|
||||||
|
make-docs:
|
||||||
|
if [[ ! -f "$(PWD)/make-docs" ]]; then
|
||||||
|
echo 'WARN: No make-docs script found in the working directory. Run `make update` to download it.' >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
.PHONY: docs
|
||||||
|
docs: ## Serve documentation locally, which includes pulling the latest `DOCS_IMAGE` (default: `grafana/docs-base:latest`) container image. See also `docs-no-pull`.
|
||||||
|
docs: docs-pull make-docs
|
||||||
|
$(PWD)/make-docs $(PROJECTS)
|
||||||
|
|
||||||
|
.PHONY: docs-no-pull
|
||||||
|
docs-no-pull: ## Serve documentation locally without pulling the `DOCS_IMAGE` (default: `grafana/docs-base:latest`) container image.
|
||||||
|
docs-no-pull: make-docs
|
||||||
|
$(PWD)/make-docs $(PROJECTS)
|
||||||
|
|
||||||
|
.PHONY: docs-debug
|
||||||
|
docs-debug: ## Run Hugo web server with debugging enabled. TODO: support all SERVER_FLAGS defined in website Makefile.
|
||||||
|
docs-debug: make-docs
|
||||||
|
WEBSITE_EXEC='hugo server --bind 0.0.0.0 --port 3002 --debug' $(PWD)/make-docs $(PROJECTS)
|
||||||
|
|
||||||
|
.PHONY: doc-validator
|
||||||
|
doc-validator: ## Run doc-validator on the entire docs folder.
|
||||||
|
doc-validator: make-docs
|
||||||
|
DOCS_IMAGE=$(DOC_VALIDATOR_IMAGE) $(PWD)/make-docs $(PROJECTS)
|
||||||
|
|
||||||
|
.PHONY: vale
|
||||||
|
vale: ## Run vale on the entire docs folder.
|
||||||
|
vale: make-docs
|
||||||
|
DOCS_IMAGE=$(VALE_IMAGE) $(PWD)/make-docs $(PROJECTS)
|
||||||
|
|
||||||
|
.PHONY: update
|
||||||
|
update: ## Fetch the latest version of this Makefile and the `make-docs` script from Writers' Toolkit.
|
||||||
|
curl -s -LO https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/docs.mk
|
||||||
|
curl -s -LO https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/make-docs
|
||||||
|
chmod +x make-docs
|
||||||
515
docs/make-docs
Executable file
515
docs/make-docs
Executable file
@@ -0,0 +1,515 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# The source of this file is https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/make-docs.
|
||||||
|
# 4.1.0 (2023-06-16)
|
||||||
|
|
||||||
|
set -ef
|
||||||
|
|
||||||
|
readonly DOCS_CONTAINER="${DOCS_CONTAINER:-make-docs}"
|
||||||
|
readonly DOCS_HOST_PORT="${DOCS_HOST_PORT:-3002}"
|
||||||
|
readonly DOCS_IMAGE="${DOCS_IMAGE:-grafana/docs-base:latest}"
|
||||||
|
|
||||||
|
readonly DOC_VALIDATOR_INCLUDE="${DOC_VALIDATOR_INCLUDE:-.+\.md$}"
|
||||||
|
readonly DOC_VALIDATOR_SKIP_CHECKS="${DOC_VALIDATOR_SKIP_CHECKS:-^image-}"
|
||||||
|
|
||||||
|
readonly HUGO_REFLINKSERRORLEVEL="${HUGO_REFLINKSERRORLEVEL:-WARNING}"
|
||||||
|
readonly VALE_MINALERTLEVEL="${VALE_MINALERTLEVEL:-error}"
|
||||||
|
readonly WEBSITE_EXEC="${WEBSITE_EXEC:-make server-docs}"
|
||||||
|
# If set, the docs-base image will run a prebuild script that sets up Hugo mounts.
|
||||||
|
readonly WEBSITE_MOUNTS="${WEBSITE_MOUNTS:-}"
|
||||||
|
|
||||||
|
PODMAN="$(if command -v podman >/dev/null 2>&1; then echo podman; else echo docker; fi)"
|
||||||
|
|
||||||
|
if ! command -v curl >/dev/null 2>&1; then
|
||||||
|
if ! command -v wget >/dev/null 2>&1; then
|
||||||
|
errr 'either `curl` or `wget` must be installed for this script to work.'
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v "${PODMAN}" >/dev/null 2>&1; then
|
||||||
|
errr 'either `podman` or `docker` must be installed for this script to work.'
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
about() {
|
||||||
|
cat <<EOF
|
||||||
|
Test documentation locally with multiple source repositories.
|
||||||
|
|
||||||
|
The REPOS_PATH environment variable is a colon (:) separated list of paths in which to look for project repositories.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Usage:
|
||||||
|
REPOS_PATH=<PATH[:<PATH>...]> $0 [<PROJECT>[:<VERSION>[:<REPO>[:<DIR>]]]...]
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
REPOS_PATH=~/ext/grafana/ $0 writers-toolkit tempo:latest helm-charts/mimir-distributed:latest:mimir:docs/sources/mimir-distributed
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ]; then
|
||||||
|
cat <<EOF >&2
|
||||||
|
ERRR: arguments required but not supplied.
|
||||||
|
|
||||||
|
$(about)
|
||||||
|
|
||||||
|
$(usage)
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
readonly REPOS_PATH="${REPOS_PATH:-$(realpath "$(git rev-parse --show-toplevel)/..")}"
|
||||||
|
|
||||||
|
if [ -z "${REPOS_PATH}" ]; then
|
||||||
|
cat <<EOF >&2
|
||||||
|
ERRR: REPOS_PATH environment variable is required but has not been provided.
|
||||||
|
|
||||||
|
$(usage)
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SOURCES_as_code='as-code-docs'
|
||||||
|
SOURCES_enterprise_metrics='backend-enterprise'
|
||||||
|
SOURCES_enterprise_metrics_='backend-enterprise'
|
||||||
|
SOURCES_grafana_cloud='website'
|
||||||
|
SOURCES_grafana_cloud_k6='k6-docs'
|
||||||
|
SOURCES_grafana_cloud_data_configuration_integrations='cloud-onboarding'
|
||||||
|
SOURCES_grafana_cloud_frontend_observability_faro_web_sdk='faro-web-sdk'
|
||||||
|
SOURCES_grafana_cloud_machine_learning='machine-learning'
|
||||||
|
SOURCES_helm_charts_mimir_distributed='mimir'
|
||||||
|
SOURCES_helm_charts_tempo_distributed='tempo'
|
||||||
|
SOURCES_opentelemetry='opentelemetry-docs'
|
||||||
|
|
||||||
|
VERSIONS_as_code='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_k6='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_data_configuration_integrations='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_frontend_observability_faro_web_sdk='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_machine_learning='UNVERSIONED'
|
||||||
|
VERSIONS_opentelemetry='UNVERSIONED'
|
||||||
|
VERSIONS_technical_documentation='UNVERSIONED'
|
||||||
|
VERSIONS_website='UNVERSIONED'
|
||||||
|
VERSIONS_writers_toolkit='UNVERSIONED'
|
||||||
|
|
||||||
|
PATHS_grafana_cloud='content/docs/grafana-cloud'
|
||||||
|
PATHS_helm_charts_mimir_distributed='docs/sources/helm-charts/mimir-distributed'
|
||||||
|
PATHS_helm_charts_tempo_distributed='docs/sources/helm-charts/tempo-distributed'
|
||||||
|
PATHS_mimir='docs/sources/mimir'
|
||||||
|
PATHS_tempo='docs/sources/tempo'
|
||||||
|
PATHS_website='content/docs'
|
||||||
|
|
||||||
|
# identifier STR
|
||||||
|
# Replace characters that are not valid in an identifier with underscores.
|
||||||
|
identifier() {
|
||||||
|
echo "$1" | tr -C '[:alnum:]_\n' '_'
|
||||||
|
}
|
||||||
|
|
||||||
|
# aget ARRAY KEY
|
||||||
|
# Get the value of KEY from associative array ARRAY.
|
||||||
|
# Characters that are not valid in an identifier are replaced with underscores.
|
||||||
|
aget() {
|
||||||
|
eval echo '$'"$(identifier "$1")_$(identifier "$2")"
|
||||||
|
}
|
||||||
|
|
||||||
|
# new_proj populates a new project structure.
|
||||||
|
new_proj() {
|
||||||
|
_project="$1"
|
||||||
|
_version="$2"
|
||||||
|
_repo="$3"
|
||||||
|
_path="$4"
|
||||||
|
|
||||||
|
# If version is not set, use the script mapping of project to default versions if it exists.
|
||||||
|
# Fallback to 'latest'.
|
||||||
|
if [ -z "${_version}" ]; then
|
||||||
|
if [ -z "$(aget VERSIONS "${_project}")" ]; then
|
||||||
|
_version=latest
|
||||||
|
else
|
||||||
|
_version="$(aget VERSIONS "${_project}")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If repo is not set, use the script mapping of project to repo name if it exists.
|
||||||
|
# Fallback to using the project name.
|
||||||
|
if [ -z "${_repo}" ]; then
|
||||||
|
if [ -z "$(aget SOURCES "${_project}")" ]; then
|
||||||
|
_repo="${_project}"
|
||||||
|
else
|
||||||
|
_repo="$(aget SOURCES "${_project}")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If path is not set, use the script mapping of project to docs sources path if it exists.
|
||||||
|
# Fallback to using 'docs/sources'.
|
||||||
|
if [ -z "${_path}" ]; then
|
||||||
|
if [ -z "$(aget PATHS "${_project}")" ]; then
|
||||||
|
_path="docs/sources"
|
||||||
|
else
|
||||||
|
_path="$(aget PATHS "${_project}")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${_project}:${_version}:${_repo}:${_path}"
|
||||||
|
unset _project _version _repo _path
|
||||||
|
}
|
||||||
|
|
||||||
|
# proj_url returns the webserver URL for a project.
|
||||||
|
# It expects a complete project structure as input.
|
||||||
|
proj_url() {
|
||||||
|
IFS=: read -r _project _version _ _ <<POSIX_HERESTRING
|
||||||
|
$1
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
if [ "${_project}" = 'website' ]; then
|
||||||
|
echo "http://localhost:${DOCS_HOST_PORT}/docs/"
|
||||||
|
|
||||||
|
unset _project _version
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${_version}" ] || [ "${_version}" = 'UNVERSIONED' ]; then
|
||||||
|
echo "http://localhost:${DOCS_HOST_PORT}/docs/${_project}/"
|
||||||
|
else
|
||||||
|
echo "http://localhost:${DOCS_HOST_PORT}/docs/${_project}/${_version}/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset _project _version
|
||||||
|
}
|
||||||
|
|
||||||
|
# proj_ver returns the version for a project.
|
||||||
|
# It expects a complete project structure as input.
|
||||||
|
proj_ver() {
|
||||||
|
IFS=: read -r _ _ver _ _ <<POSIX_HERESTRING
|
||||||
|
$1
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
echo "${_ver}"
|
||||||
|
unset _ver
|
||||||
|
}
|
||||||
|
|
||||||
|
# proj_dst returns the container path to content source for a project.
|
||||||
|
# It expects a complete project structure as input.
|
||||||
|
proj_dst() {
|
||||||
|
IFS=: read -r _project _version _ _ <<POSIX_HERESTRING
|
||||||
|
$1
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
if [ "${_project}" = 'website' ]; then
|
||||||
|
echo '/hugo/content/docs'
|
||||||
|
|
||||||
|
unset _project _version
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${_version}" ] || [ "${_version}" = 'UNVERSIONED' ]; then
|
||||||
|
echo "/hugo/content/docs/${_project}"
|
||||||
|
else
|
||||||
|
echo "/hugo/content/docs/${_project}/${_version}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset _project _version
|
||||||
|
}
|
||||||
|
|
||||||
|
# repo_path returns the host path to the project repository.
|
||||||
|
# It looks for the provided repository name in each of the paths specified in the REPOS_PATH environment variable.
|
||||||
|
repo_path() {
|
||||||
|
_repo="$1"
|
||||||
|
IFS=:
|
||||||
|
for lookup in ${REPOS_PATH}; do
|
||||||
|
if [ -d "${lookup}/${_repo}" ]; then
|
||||||
|
echo "${lookup}/${_repo}"
|
||||||
|
unset _path _repo
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
|
||||||
|
errr "could not find project '${_repo}' in any of the paths in REPOS_PATH '${REPOS_PATH}'."
|
||||||
|
note "you must have a checkout of the project '${_repo}' at '${REPOS_PATH##:*}/${_repo}'."
|
||||||
|
note "if you have cloned the repository into a directory with a different name, consider changing it to ${_repo}."
|
||||||
|
|
||||||
|
unset _repo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# proj_src returns the host path to content source for a project.
|
||||||
|
# It expects a complete project structure as input.
|
||||||
|
# It looks for the provided repository name in each of the paths specified in the REPOS_PATH environment variable.
|
||||||
|
proj_src() {
|
||||||
|
IFS=: read -r _ _ _repo _path <<POSIX_HERESTRING
|
||||||
|
$1
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
_repo="$(repo_path "${_repo}")"
|
||||||
|
echo "${_repo}/${_path}"
|
||||||
|
|
||||||
|
unset _path _repo
|
||||||
|
}
|
||||||
|
|
||||||
|
# proj_canonical returns the canonical absolute path partial URI for a project.
|
||||||
|
# It expects a complete project structure as input.
|
||||||
|
proj_canonical() {
|
||||||
|
IFS=: read -r _project _version _ _ <<POSIX_HERESTRING
|
||||||
|
$1
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
if [ "${_project}" = 'website' ]; then
|
||||||
|
echo '/docs'
|
||||||
|
|
||||||
|
unset _project _version
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${_version}" ] || [ "${_version}" = 'UNVERSIONED' ]; then
|
||||||
|
echo "/docs/${_project}"
|
||||||
|
else
|
||||||
|
echo "/docs/${_project}/${_version}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset _project _version
|
||||||
|
}
|
||||||
|
|
||||||
|
proj_to_url_src_dst_ver() {
|
||||||
|
_url="$(proj_url "$1")"
|
||||||
|
_src="$(proj_src "$1")"
|
||||||
|
_dst="$(proj_dst "$1")"
|
||||||
|
_ver="$(proj_ver "$1")"
|
||||||
|
|
||||||
|
echo "${_url}^${_src}^${_dst}^${_ver}"
|
||||||
|
unset _url _src _dst _ver
|
||||||
|
}
|
||||||
|
|
||||||
|
url_src_dst_vers() {
|
||||||
|
for arg in "$@"; do
|
||||||
|
IFS=: read -r _project _version _repo _path <<POSIX_HERESTRING
|
||||||
|
$arg
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
case "${_project}" in
|
||||||
|
# Workaround for arbitrary mounts where the version field is expected to be the local directory
|
||||||
|
# and the repo field is expected to be the container directory.
|
||||||
|
arbitrary)
|
||||||
|
echo "${_project}^${_version}^${_repo}^" # TODO
|
||||||
|
;;
|
||||||
|
logs)
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj loki "${_version}")"
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj enterprise-logs "${_version}")"
|
||||||
|
;;
|
||||||
|
metrics)
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj mimir "${_version}")"
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj helm-charts/mimir-distributed "${_version}")"
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj enterprise-metrics "${_version}")"
|
||||||
|
;;
|
||||||
|
traces)
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj tempo "${_version}")"
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj enterprise-traces "${_version}")"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
proj_to_url_src_dst_ver "$(new_proj "${_project}" "${_version}" "${_repo}" "${_path}")"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
unset _project _version _repo _path
|
||||||
|
}
|
||||||
|
|
||||||
|
await_build() {
|
||||||
|
url="$1"
|
||||||
|
req="$(if command -v curl >/dev/null 2>&1; then echo 'curl -s -o /dev/null'; else echo 'wget -q'; fi)"
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
if ${req} "${url}"; then
|
||||||
|
echo
|
||||||
|
echo "View documentation locally:"
|
||||||
|
for x in ${url_src_dst_vers}; do
|
||||||
|
IFS='^' read -r url _ _ <<POSIX_HERESTRING
|
||||||
|
$x
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
if [ -n "${url}" ]; then
|
||||||
|
if [ "${_url}" != "arbitrary" ]; then
|
||||||
|
echo " ${url}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
echo 'Press Ctrl+C to stop the server'
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
errr 'The build was interrupted or a build error occurred, check the previous logs for possible causes.'
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset url req
|
||||||
|
}
|
||||||
|
|
||||||
|
debg() {
|
||||||
|
if [ -n "${DEBUG}" ]; then
|
||||||
|
echo "DEBG: $1" >&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
errr() {
|
||||||
|
echo "ERRR: $1" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
note() {
|
||||||
|
echo "NOTE: $1" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
url_src_dst_vers="$(url_src_dst_vers "$@")"
|
||||||
|
|
||||||
|
volumes=""
|
||||||
|
redirects=""
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
IFS=: read -r _project _ _repo _ <<POSIX_HERESTRING
|
||||||
|
${arg}
|
||||||
|
POSIX_HERESTRING
|
||||||
|
if [ "${_project}" = website ]; then
|
||||||
|
_repo="$(repo_path website)"
|
||||||
|
volumes="--volume=${_repo}/config:/hugo/config"
|
||||||
|
volumes="${volumes} --volume=${_repo}/layouts/partials:/hugo/layouts/partials"
|
||||||
|
volumes="${volumes} --volume=${_repo}/layouts/shortcodes:/hugo/layouts/shortcodes"
|
||||||
|
fi
|
||||||
|
unset _project _repo
|
||||||
|
done
|
||||||
|
|
||||||
|
for x in ${url_src_dst_vers}; do
|
||||||
|
IFS='^' read -r _url _src _dst _ver <<POSIX_HERESTRING
|
||||||
|
$x
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
if [ "${_url}" != "arbitrary" ]; then
|
||||||
|
if [ ! -f "${_src}/_index.md" ]; then
|
||||||
|
errr "Index file '${_src}/_index.md' does not exist."
|
||||||
|
note "Is '${_src}' the correct source directory?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
debg "DEBG: Mounting '${_src}' at container path '${_dst}'"
|
||||||
|
|
||||||
|
if [ -z "${volumes}" ]; then
|
||||||
|
volumes="--volume=${_src}:${_dst}"
|
||||||
|
else
|
||||||
|
volumes="${volumes} --volume=${_src}:${_dst}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${_ver}" ] && [ "${_ver}" != 'UNVERSIONED' ]; then
|
||||||
|
if [ -z "${redirects}" ]; then
|
||||||
|
redirects="${_dst}^${_ver}"
|
||||||
|
else
|
||||||
|
redirects="${redirects} ${_dst}^${_ver}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
unset _url _src _dst _ver
|
||||||
|
done
|
||||||
|
|
||||||
|
IFS=':' read -r image _ <<POSIX_HERESTRING
|
||||||
|
${DOCS_IMAGE}
|
||||||
|
POSIX_HERESTRING
|
||||||
|
|
||||||
|
case "${image}" in
|
||||||
|
'grafana/doc-validator')
|
||||||
|
proj="$(new_proj "$1")"
|
||||||
|
echo
|
||||||
|
"${PODMAN}" run \
|
||||||
|
--init \
|
||||||
|
--interactive \
|
||||||
|
--name "${DOCS_CONTAINER}" \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
${volumes} \
|
||||||
|
"${DOCS_IMAGE}" \
|
||||||
|
"--include=${DOC_VALIDATOR_INCLUDE}" \
|
||||||
|
"--skip-checks=${DOC_VALIDATOR_SKIP_CHECKS}" \
|
||||||
|
/hugo/content/docs \
|
||||||
|
"$(proj_canonical "${proj}")" | sed "s#$(proj_dst "${proj}")#sources#"
|
||||||
|
;;
|
||||||
|
'grafana/vale')
|
||||||
|
proj="$(new_proj "$1")"
|
||||||
|
echo
|
||||||
|
"${PODMAN}" run \
|
||||||
|
--init \
|
||||||
|
--interactive \
|
||||||
|
--name "${DOCS_CONTAINER}" \
|
||||||
|
--platform linux/amd64 \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
${volumes} \
|
||||||
|
"${DOCS_IMAGE}" \
|
||||||
|
"--minAlertLevel=${VALE_MINALERTLEVEL}" \
|
||||||
|
--config=/etc/vale/.vale.ini \
|
||||||
|
--output=line \
|
||||||
|
/hugo/content/docs | sed "s#$(proj_dst "${proj}")#sources#"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tempfile="$(mktemp -t make-docs.XXX)"
|
||||||
|
cat <<EOF >"${tempfile}"
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
for redirect in ${redirects}; do
|
||||||
|
IFS='^' read -r path ver <<<"\${redirect}"
|
||||||
|
echo -e "---\\nredirectURL: \"\${path/\/hugo\/content/}\"\\ntype: redirect\\nversioned: true\\n---\\n" > "\${path/\${ver}/_index.md}"
|
||||||
|
done
|
||||||
|
|
||||||
|
for x in "${url_src_dst_vers}"; do
|
||||||
|
IFS='^' read -r _ _ dst _ <<<"\${x}"
|
||||||
|
|
||||||
|
while [[ -n "\${dst}" ]]; do
|
||||||
|
touch "\${dst}/_index.md"
|
||||||
|
dst="\${dst%/*}"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n "${WEBSITE_MOUNTS}" ]]; then
|
||||||
|
unset WEBSITE_SKIP_MOUNTS
|
||||||
|
fi
|
||||||
|
|
||||||
|
${WEBSITE_EXEC}
|
||||||
|
EOF
|
||||||
|
chmod +x "${tempfile}"
|
||||||
|
volumes="${volumes} --volume=$(realpath "${tempfile}"):/entrypoint"
|
||||||
|
readonly volumes
|
||||||
|
|
||||||
|
IFS='' read -r cmd <<EOF
|
||||||
|
${PODMAN} run \
|
||||||
|
--env=HUGO_REFLINKSERRORLEVEL=${HUGO_REFLINKSERRORLEVEL} \
|
||||||
|
--init \
|
||||||
|
--interactive \
|
||||||
|
--name=${DOCS_CONTAINER} \
|
||||||
|
--platform=linux/amd64 \
|
||||||
|
--publish=${DOCS_HOST_PORT}:3002 \
|
||||||
|
--publish=3003:3003 \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
${volumes} \
|
||||||
|
${DOCS_IMAGE} \
|
||||||
|
/entrypoint
|
||||||
|
EOF
|
||||||
|
await_build http://localhost:3002 &
|
||||||
|
|
||||||
|
if [ -n "${DEBUG}" ]; then
|
||||||
|
${cmd}
|
||||||
|
else
|
||||||
|
${cmd} 2>&1| sed \
|
||||||
|
-e '/Web Server is available at http:\/\/localhost:3003\/ (bind address 0.0.0.0)/ d' \
|
||||||
|
-e '/^hugo server/ d' \
|
||||||
|
-e '/fatal: not a git repository (or any parent up to mount point \/)/ d' \
|
||||||
|
-e '/Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)./ d' \
|
||||||
|
-e "/Makefile:[0-9]*: warning: overriding recipe for target 'docs'/ d" \
|
||||||
|
-e "/docs.mk:[0-9]*: warning: ignoring old recipe for target 'docs'/ d" \
|
||||||
|
-e '/\/usr\/bin\/make -j 2 proxy hserver-docs HUGO_PORT=3003/ d' \
|
||||||
|
-e '/website-proxy/ d' \
|
||||||
|
-e '/rm -rf dist*/ d' \
|
||||||
|
-e '/Press Ctrl+C to stop/ d' \
|
||||||
|
-e '/make/ d' || echo
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -40,7 +40,7 @@ title: Grafana documentation
|
|||||||
</div>
|
</div>
|
||||||
<h5>Grafana Cloud</h5>
|
<h5>Grafana Cloud</h5>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://grafana.com/grafana/download" class="nav-cards__item nav-cards__item--install">
|
<a href="https://grafana.com/grafana/nightly?edition=oss" class="nav-cards__item nav-cards__item--install">
|
||||||
<div class="nav-cards__icon fa fa-moon-o">
|
<div class="nav-cards__icon fa fa-moon-o">
|
||||||
</div>
|
</div>
|
||||||
<h5>Nightly builds</h5>
|
<h5>Nightly builds</h5>
|
||||||
@@ -70,8 +70,8 @@ title: Grafana documentation
|
|||||||
<h4>Provisioning</h4>
|
<h4>Provisioning</h4>
|
||||||
<p>Learn how to automate your Grafana configuration.</p>
|
<p>Learn how to automate your Grafana configuration.</p>
|
||||||
</a>
|
</a>
|
||||||
<a href="{{< relref "whatsnew/whats-new-in-v9-2/" >}}" class="nav-cards__item nav-cards__item--guide">
|
<a href="{{< relref "whatsnew/whats-new-in-v9-4/" >}}" class="nav-cards__item nav-cards__item--guide">
|
||||||
<h4>What's new in v9.2</h4>
|
<h4>What's new in v9.4</h4>
|
||||||
<p>Explore the features and enhancements in the latest release.</p>
|
<p>Explore the features and enhancements in the latest release.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
---
|
---
|
||||||
|
cascade:
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
description: Administration
|
description: Administration
|
||||||
title: Administration
|
title: Administration
|
||||||
weight: 40
|
weight: 40
|
||||||
|
|||||||
@@ -79,10 +79,12 @@ After you have enabled permissions for a data source you can assign query permis
|
|||||||
**Assign query permission to users and teams:**
|
**Assign query permission to users and teams:**
|
||||||
|
|
||||||
1. Navigate to **Configuration > Data Sources**.
|
1. Navigate to **Configuration > Data Sources**.
|
||||||
1. Select the data source you want to assign query permissions for.
|
1. Select the data source you want to assign query permissions to.
|
||||||
1. On the Permissions tab, click **Add Permission**.
|
1. On the **Permissions** tab, click **Add Permission**.
|
||||||
1. Select **Team** or **User**.
|
1. Select **Team**, **User**, or **Role**.
|
||||||
1. Select the entity you want to allow query access and then click **Save**.
|
1. Select the entity you want to modify permissions for.
|
||||||
|
1. Select the **Query** or **Edit** permission.
|
||||||
|
1. Click **Save**.
|
||||||
|
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ aliases:
|
|||||||
- ../enterprise/license/license-expiration/
|
- ../enterprise/license/license-expiration/
|
||||||
- ../enterprise/license/license-restrictions/
|
- ../enterprise/license/license-restrictions/
|
||||||
- license-restrictions/
|
- license-restrictions/
|
||||||
|
cascade:
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
description: Activate and manage a Grafana Enterprise license
|
description: Activate and manage a Grafana Enterprise license
|
||||||
keywords:
|
keywords:
|
||||||
- grafana
|
- grafana
|
||||||
@@ -99,7 +103,7 @@ GF_SERVER_ROOT_URL=https://grafana.example.com/
|
|||||||
|
|
||||||
### Step 4. Restart Grafana
|
### Step 4. Restart Grafana
|
||||||
|
|
||||||
To finalize the installation of Grafana Enterprise, restart Grafana to enable all Grafana Enterprise features. Refer to [restart Grafana]({{< relref "../../setup-grafana/restart-grafana/" >}}) for more information.
|
To finalize the installation of Grafana Enterprise, restart Grafana to enable all Grafana Enterprise features. Refer to [restart Grafana]({{< relref "../../setup-grafana/start-restart-grafana/" >}}) for more information.
|
||||||
|
|
||||||
## License expiration
|
## License expiration
|
||||||
|
|
||||||
@@ -121,7 +125,7 @@ If your license has expired, most of Grafana keeps working as normal. Some enter
|
|||||||
2. Log in to your [Grafana Cloud Account](/login) and make sure you're in the correct organization in the dropdown at the top of the page.
|
2. Log in to your [Grafana Cloud Account](/login) and make sure you're in the correct organization in the dropdown at the top of the page.
|
||||||
3. Under the **Grafana Enterprise** section in the menu bar to the left, choose licenses and download the currently valid license with which you want to run Grafana. If you cannot see a valid license on Grafana.com, please contact your account manager at Grafana Labs to renew your subscription.
|
3. Under the **Grafana Enterprise** section in the menu bar to the left, choose licenses and download the currently valid license with which you want to run Grafana. If you cannot see a valid license on Grafana.com, please contact your account manager at Grafana Labs to renew your subscription.
|
||||||
4. Replace the current `license.jwt`-file with the one you've just downloaded.
|
4. Replace the current `license.jwt`-file with the one you've just downloaded.
|
||||||
5. [Restart Grafana]({{< relref "../../setup-grafana/restart-grafana/" >}}).
|
5. [Restart Grafana]({{< relref "../../setup-grafana/start-restart-grafana/" >}}).
|
||||||
|
|
||||||
### If your license expires
|
### If your license expires
|
||||||
|
|
||||||
|
|||||||
@@ -121,6 +121,6 @@ To restart Grafana on a Kubernetes cluster,
|
|||||||
|
|
||||||
1. After you update the service, navigate to your Grafana instance, sign in with Grafana Admin credentials, and navigate to the Statistics and Licensing page to validate that your license is active.
|
1. After you update the service, navigate to your Grafana instance, sign in with Grafana Admin credentials, and navigate to the Statistics and Licensing page to validate that your license is active.
|
||||||
|
|
||||||
For more information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../../setup-grafana/restart-grafana/" >}}).
|
For more information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../../setup-grafana/start-restart-grafana/" >}}).
|
||||||
|
|
||||||
> If you experience issues when you update the EKS cluster, refer to [Amazon EKS troubleshooting](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html).
|
> If you experience issues when you update the EKS cluster, refer to [Amazon EKS troubleshooting](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html).
|
||||||
|
|||||||
@@ -127,4 +127,4 @@ Choose one of the following options to update the [license_validation_type]({{<
|
|||||||
|
|
||||||
To activate Grafana Enterprise features, start (or restart) Grafana.
|
To activate Grafana Enterprise features, start (or restart) Grafana.
|
||||||
|
|
||||||
For information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../../setup-grafana/restart-grafana/" >}}).
|
For information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../../setup-grafana/start-restart-grafana/" >}}).
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ description: Describes how to use organizations to isolate dashboard to users an
|
|||||||
keywords:
|
keywords:
|
||||||
- organizations
|
- organizations
|
||||||
- dashboards
|
- dashboards
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
menuTitle: Manage organizations
|
menuTitle: Manage organizations
|
||||||
title: Manage organizations
|
title: Manage organizations
|
||||||
weight: 200
|
weight: 200
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ description: Describes provisioning settings for Grafana using configuration fil
|
|||||||
keywords:
|
keywords:
|
||||||
- grafana
|
- grafana
|
||||||
- provisioning
|
- provisioning
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
title: Provision Grafana
|
title: Provision Grafana
|
||||||
weight: 600
|
weight: 600
|
||||||
---
|
---
|
||||||
@@ -57,7 +61,7 @@ Currently we do not provide any scripts/manifests for configuring Grafana. Rathe
|
|||||||
| --------- | -------------------------------------------------------------------------------------------------------------- |
|
| --------- | -------------------------------------------------------------------------------------------------------------- |
|
||||||
| Puppet | [https://forge.puppet.com/puppet/grafana](https://forge.puppet.com/puppet/grafana) |
|
| Puppet | [https://forge.puppet.com/puppet/grafana](https://forge.puppet.com/puppet/grafana) |
|
||||||
| Ansible | [https://github.com/cloudalchemy/ansible-grafana](https://github.com/cloudalchemy/ansible-grafana) |
|
| Ansible | [https://github.com/cloudalchemy/ansible-grafana](https://github.com/cloudalchemy/ansible-grafana) |
|
||||||
| Chef | [https://github.com/JonathanTron/chef-grafana](https://github.com/JonathanTron/chef-grafana) |
|
| Chef | [https://github.com/sous-chefs/chef-grafana](https://github.com/sous-chefs/chef-grafana) |
|
||||||
| Saltstack | [https://github.com/salt-formulas/salt-formula-grafana](https://github.com/salt-formulas/salt-formula-grafana) |
|
| Saltstack | [https://github.com/salt-formulas/salt-formula-grafana](https://github.com/salt-formulas/salt-formula-grafana) |
|
||||||
| Jsonnet | [https://github.com/grafana/grafonnet-lib/](https://github.com/grafana/grafonnet-lib/) |
|
| Jsonnet | [https://github.com/grafana/grafonnet-lib/](https://github.com/grafana/grafonnet-lib/) |
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ keywords:
|
|||||||
- query
|
- query
|
||||||
- queries
|
- queries
|
||||||
- recorded
|
- recorded
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
title: Recorded queries
|
title: Recorded queries
|
||||||
weight: 300
|
weight: 300
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -3,6 +3,11 @@ aliases:
|
|||||||
- ../../enterprise/access-control/
|
- ../../enterprise/access-control/
|
||||||
- ../../enterprise/access-control/about-rbac/
|
- ../../enterprise/access-control/about-rbac/
|
||||||
- ../../enterprise/access-control/roles/
|
- ../../enterprise/access-control/roles/
|
||||||
|
cascade:
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
description: Role-based access control (RBAC) provides a standardized way of granting,
|
description: Role-based access control (RBAC) provides a standardized way of granting,
|
||||||
changing, and revoking access so that users can view and modify Grafana resources,
|
changing, and revoking access so that users can view and modify Grafana resources,
|
||||||
such as users and reports.
|
such as users and reports.
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ weight: 80
|
|||||||
|
|
||||||
# RBAC permissions, actions, and scopes
|
# RBAC permissions, actions, and scopes
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise/" >}}) and [Grafana Cloud Advanced](/docs/grafana-cloud).
|
{{% admonition type="note" %}}
|
||||||
|
Available in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise/" >}}) and [Grafana Cloud Advanced](/docs/grafana-cloud).
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
A permission is comprised of an action and a scope. When creating a custom role, consider the actions the user can perform and the resource(s) on which they can perform those actions.
|
A permission is comprised of an action and a scope. When creating a custom role, consider the actions the user can perform and the resource(s) on which they can perform those actions.
|
||||||
|
|
||||||
@@ -23,128 +25,129 @@ To learn more about the Grafana resources to which you can apply RBAC, refer to
|
|||||||
|
|
||||||
The following list contains role-based access control actions.
|
The following list contains role-based access control actions.
|
||||||
|
|
||||||
| Action | Applicable scope | Description |
|
| Action | Applicable scope | Description |
|
||||||
| ------------------------------------ | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
| ------------------------------------ | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `alert.instances.external:read` | `datasources:*`<br>`datasources:uid:*` | Read alerts and silences in data sources that support alerting. |
|
| `alert.instances.external:read` | `datasources:*`<br>`datasources:uid:*` | Read alerts and silences in data sources that support alerting. |
|
||||||
| `alert.instances.external:write` | `datasources:*`<br>`datasources:uid:*` | Manage alerts and silences in data sources that support alerting. |
|
| `alert.instances.external:write` | `datasources:*`<br>`datasources:uid:*` | Manage alerts and silences in data sources that support alerting. |
|
||||||
| `alert.instances:create` | n/a | Create silences in the current organization. |
|
| `alert.instances:create` | n/a | Create silences in the current organization. |
|
||||||
| `alert.instances:read` | n/a | Read alerts and silences in the current organization. |
|
| `alert.instances:read` | n/a | Read alerts and silences in the current organization. |
|
||||||
| `alert.instances:write` | n/a | Update and expire silences in the current organization. |
|
| `alert.instances:write` | n/a | Update and expire silences in the current organization. |
|
||||||
| `alert.notifications.external:read` | `datasources:*`<br>`datasources:uid:*` | Read templates, contact points, notification policies, and mute timings in data sources that support alerting. |
|
| `alert.notifications.external:read` | `datasources:*`<br>`datasources:uid:*` | Read templates, contact points, notification policies, and mute timings in data sources that support alerting. |
|
||||||
| `alert.notifications.external:write` | `datasources:*`<br>`datasources:uid:*` | Manage templates, contact points, notification policies, and mute timings in data sources that support alerting. |
|
| `alert.notifications.external:write` | `datasources:*`<br>`datasources:uid:*` | Manage templates, contact points, notification policies, and mute timings in data sources that support alerting. |
|
||||||
| `alert.notifications:write` | n/a | Manage templates, contact points, notification policies, and mute timings in the current organization. |
|
| `alert.notifications:write` | n/a | Manage templates, contact points, notification policies, and mute timings in the current organization. |
|
||||||
| `alert.notifications:read` | n/a | Read all templates, contact points, notification policies, and mute timings in the current organization. |
|
| `alert.notifications:read` | n/a | Read all templates, contact points, notification policies, and mute timings in the current organization. |
|
||||||
| `alert.rules.external:read` | `datasources:*`<br>`datasources:uid:*` | Read alert rules in data sources that support alerting (Prometheus, Mimir, and Loki) |
|
| `alert.rules.external:read` | `datasources:*`<br>`datasources:uid:*` | Read alert rules in data sources that support alerting (Prometheus, Mimir, and Loki) |
|
||||||
| `alert.rules.external:write` | `datasources:*`<br>`datasources:uid:*` | Create, update, and delete alert rules in data sources that support alerting (Mimir and Loki). |
|
| `alert.rules.external:write` | `datasources:*`<br>`datasources:uid:*` | Create, update, and delete alert rules in data sources that support alerting (Mimir and Loki). |
|
||||||
| `alert.rules:create` | `folders:*`<br>`folders:uid:*` | Create Grafana alert rules in a folder. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
| `alert.rules:create` | `folders:*`<br>`folders:uid:*` | Create Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
||||||
| `alert.rules:delete` | `folders:*`<br>`folders:uid:*` | Delete Grafana alert rules in a folder. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
| `alert.rules:delete` | `folders:*`<br>`folders:uid:*` | Delete Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
||||||
| `alert.rules:read` | `folders:*`<br>`folders:uid:*` | Read Grafana alert rules in a folder. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
| `alert.rules:read` | `folders:*`<br>`folders:uid:*` | Read Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
||||||
| `alert.rules:write` | `folders:*`<br>`folders:uid:*` | Update Grafana alert rules in a folder. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
| `alert.rules:write` | `folders:*`<br>`folders:uid:*` | Update Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. |
|
||||||
| `alert.provisioning:read` | n/a | Read all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. |
|
| `alert.provisioning:read` | n/a | Read all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. |
|
||||||
| `alert.provisioning:write` | n/a | Update all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. |
|
| `alert.provisioning:write` | n/a | Update all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. |
|
||||||
| `annotations:create` | `annotations:*`<br>`annotations:type:*` | Create annotations. |
|
| `annotations:create` | `annotations:*`<br>`annotations:type:*` | Create annotations. |
|
||||||
| `annotations:delete` | `annotations:*`<br>`annotations:type:*` | Delete annotations. |
|
| `annotations:delete` | `annotations:*`<br>`annotations:type:*` | Delete annotations. |
|
||||||
| `annotations:read` | `annotations:*`<br>`annotations:type:*` | Read annotations and annotation tags. |
|
| `annotations:read` | `annotations:*`<br>`annotations:type:*` | Read annotations and annotation tags. |
|
||||||
| `annotations:write` | `annotations:*`<br>`annotations:type:*` | Update annotations. |
|
| `annotations:write` | `annotations:*`<br>`annotations:type:*` | Update annotations. |
|
||||||
| `apikeys:create` | n/a | Create API keys. |
|
| `apikeys:create` | n/a | Create API keys. |
|
||||||
| `apikeys:read` | `apikeys:*`<br>`apikeys:id:*` | Read API keys. |
|
| `apikeys:read` | `apikeys:*`<br>`apikeys:id:*` | Read API keys. |
|
||||||
| `apikeys:delete` | `apikeys:*`<br>`apikeys:id:*` | Delete API keys. |
|
| `apikeys:delete` | `apikeys:*`<br>`apikeys:id:*` | Delete API keys. |
|
||||||
| `dashboards:create` | `folders:*`<br>`folders:uid:*` | Create dashboards in one or more folders. |
|
| `dashboards:create` | `folders:*`<br>`folders:uid:*` | Create dashboards in one or more folders and their subfolders. |
|
||||||
| `dashboards:delete` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Delete one or more dashboards. |
|
| `dashboards:delete` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Delete one or more dashboards. |
|
||||||
| `dashboards.insights:read` | n/a | Read dashboard insights data and see presence indicators. |
|
| `dashboards.insights:read` | n/a | Read dashboard insights data and see presence indicators. |
|
||||||
| `dashboards.permissions:read` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Read permissions for one or more dashboards. |
|
| `dashboards.permissions:read` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Read permissions for one or more dashboards. |
|
||||||
| `dashboards.permissions:write` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Update permissions for one or more dashboards. |
|
| `dashboards.permissions:write` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Update permissions for one or more dashboards. |
|
||||||
| `dashboards:read` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Read one or more dashboards. |
|
| `dashboards:read` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Read one or more dashboards. |
|
||||||
| `dashboards:write` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Update one or more dashboards. |
|
| `dashboards:write` | `dashboards:*`<br>`dashboards:uid:*`<br>`folders:*`<br>`folders:uid:*` | Update one or more dashboards. |
|
||||||
| `datasources.caching:read` | `datasources:*`<br>`datasources:uid:*` | Read data source query caching settings. |
|
| `dashboards.public:write` | `dashboards:*`<br>`dashboards:uid:*` | Write public dashboard configuration. |
|
||||||
| `datasources.caching:write` | `datasources:*`<br>`datasources:uid:*` | Update data source query caching settings. |
|
| `datasources.caching:read` | `datasources:*`<br>`datasources:uid:*` | Read data source query caching settings. |
|
||||||
| `datasources:create` | n/a | Create data sources. |
|
| `datasources.caching:write` | `datasources:*`<br>`datasources:uid:*` | Update data source query caching settings. |
|
||||||
| `datasources:delete` | `datasources:*`<br>`datasources:uid:*` | Delete data sources. |
|
| `datasources:create` | n/a | Create data sources. |
|
||||||
| `datasources:explore` | n/a | Enable access to the **Explore** tab. |
|
| `datasources:delete` | `datasources:*`<br>`datasources:uid:*` | Delete data sources. |
|
||||||
| `datasources.id:read` | `datasources:*`<br>`datasources:uid:*` | Read data source IDs. |
|
| `datasources:explore` | n/a | Enable access to the **Explore** tab. |
|
||||||
| `datasources.insights:read` | n/a | Read data sources insights data. |
|
| `datasources.id:read` | `datasources:*`<br>`datasources:uid:*` | Read data source IDs. |
|
||||||
| `datasources.permissions:read` | `datasources:*`<br>`datasources:uid:*` | List data source permissions. |
|
| `datasources.insights:read` | n/a | Read data sources insights data. |
|
||||||
| `datasources.permissions:write` | `datasources:*`<br>`datasources:uid:*` | Update data source permissions. |
|
| `datasources.permissions:read` | `datasources:*`<br>`datasources:uid:*` | List data source permissions. |
|
||||||
| `datasources:query` | `datasources:*`<br>`datasources:uid:*` | Query data sources. |
|
| `datasources.permissions:write` | `datasources:*`<br>`datasources:uid:*` | Update data source permissions. |
|
||||||
| `datasources:read` | `datasources:*`<br>`datasources:uid:*` | List data sources. |
|
| `datasources:query` | `datasources:*`<br>`datasources:uid:*` | Query data sources. |
|
||||||
| `datasources:write` | `datasources:*`<br>`datasources:uid:*` | Update data sources. |
|
| `datasources:read` | `datasources:*`<br>`datasources:uid:*` | List data sources. |
|
||||||
| `folders.permissions:read` | `folders:*`<br>`folders:uid:*` | Read permissions for one or more folders. |
|
| `datasources:write` | `datasources:*`<br>`datasources:uid:*` | Update data sources. |
|
||||||
| `folders.permissions:write` | `folders:*`<br>`folders:uid:*` | Update permissions for one or more folders. |
|
| `folders.permissions:read` | `folders:*`<br>`folders:uid:*` | Read permissions for one or more folders and their subfolders. |
|
||||||
| `folders:create` | n/a | Create folders. |
|
| `folders.permissions:write` | `folders:*`<br>`folders:uid:*` | Update permissions for one or more folders and their subfolders. |
|
||||||
| `folders:delete` | `folders:*`<br>`folders:uid:*` | Delete one or more folders. |
|
| `folders:create` | n/a | Create folders in the root level. If granted together with `folders:write`, also allows creating subfolders under all folders that the user can update. |
|
||||||
| `folders:read` | `folders:*`<br>`folders:uid:*` | Read one or more folders. |
|
| `folders:delete` | `folders:*`<br>`folders:uid:*` | Delete one or more folders and their subfolders. |
|
||||||
| `folders:write` | `folders:*`<br>`folders:uid:*` | Update one or more folders. |
|
| `folders:read` | `folders:*`<br>`folders:uid:*` | Read one or more folders and their subfolders. |
|
||||||
| `ldap.config:reload` | n/a | Reload the LDAP configuration. |
|
| `folders:write` | `folders:*`<br>`folders:uid:*` | Update one or more folders and their subfolders. If granted together with `folders:create` permission, also allows creating subfolders under these folders. |
|
||||||
| `ldap.status:read` | n/a | Verify the availability of the LDAP server or servers. |
|
| `ldap.config:reload` | n/a | Reload the LDAP configuration. |
|
||||||
| `ldap.user:read` | n/a | Read users via LDAP. |
|
| `ldap.status:read` | n/a | Verify the availability of the LDAP server or servers. |
|
||||||
| `ldap.user:sync` | n/a | Sync users via LDAP. |
|
| `ldap.user:read` | n/a | Read users via LDAP. |
|
||||||
| `licensing.reports:read` | n/a | Get custom permission reports. |
|
| `ldap.user:sync` | n/a | Sync users via LDAP. |
|
||||||
| `licensing:delete` | n/a | Delete the license token. |
|
| `licensing.reports:read` | n/a | Get custom permission reports. |
|
||||||
| `licensing:read` | n/a | Read licensing information. |
|
| `licensing:delete` | n/a | Delete the license token. |
|
||||||
| `licensing:write` | n/a | Update the license token. |
|
| `licensing:read` | n/a | Read licensing information. |
|
||||||
| `org.users:write` | `users:*` <br> `users:id:*` | Update the organization role (`Viewer`, `Editor`, or `Admin`) of a user. |
|
| `licensing:write` | n/a | Update the license token. |
|
||||||
| `org.users:add` | `users:*` | Add a user to an organization or invite a new user to an organization. |
|
| `org.users:write` | `users:*` <br> `users:id:*` | Update the organization role (`Viewer`, `Editor`, or `Admin`) of a user. |
|
||||||
| `org.users:read` | `users:*` <br> `users:id:*` | Get user profiles within an organization. |
|
| `org.users:add` | `users:*` | Add a user to an organization or invite a new user to an organization. |
|
||||||
| `org.users:remove` | `users:*` <br> `users:id:*` | Remove a user from an organization. |
|
| `org.users:read` | `users:*` <br> `users:id:*` | Get user profiles within an organization. |
|
||||||
| `org:create` | n/a | Create an organization. |
|
| `org.users:remove` | `users:*` <br> `users:id:*` | Remove a user from an organization. |
|
||||||
| `orgs.preferences:read` | `orgs:*` <br> `orgs:id:*` | Read organization preferences. |
|
| `org:create` | n/a | Create an organization. |
|
||||||
| `orgs.preferences:write` | `orgs:*` <br> `orgs:id:*` | Update organization preferences. |
|
| `orgs.preferences:read` | `orgs:*` <br> `orgs:id:*` | Read organization preferences. |
|
||||||
| `orgs.quotas:read` | `orgs:*` <br> `orgs:id:*` | Read organization quotas. |
|
| `orgs.preferences:write` | `orgs:*` <br> `orgs:id:*` | Update organization preferences. |
|
||||||
| `orgs.quotas:write` | `orgs:*` <br> `orgs:id:*` | Update organization quotas. |
|
| `orgs.quotas:read` | `orgs:*` <br> `orgs:id:*` | Read organization quotas. |
|
||||||
| `orgs:delete` | `orgs:*` <br> `orgs:id:*` | Delete one or more organizations. |
|
| `orgs.quotas:write` | `orgs:*` <br> `orgs:id:*` | Update organization quotas. |
|
||||||
| `orgs:read` | `orgs:*` <br> `orgs:id:*` | Read one or more organizations. |
|
| `orgs:delete` | `orgs:*` <br> `orgs:id:*` | Delete one or more organizations. |
|
||||||
| `orgs:write` | `orgs:*` <br> `orgs:id:*` | Update one or more organizations. |
|
| `orgs:read` | `orgs:*` <br> `orgs:id:*` | Read one or more organizations. |
|
||||||
| `plugins.app:access` | `plugins:*` <br> `plugins:id:*` | Access one or more application plugins (still enforcing the organization role) |
|
| `orgs:write` | `orgs:*` <br> `orgs:id:*` | Update one or more organizations. |
|
||||||
| `plugins:install` | n/a | Install and uninstall plugins. |
|
| `plugins.app:access` | `plugins:*` <br> `plugins:id:*` | Access one or more application plugins (still enforcing the organization role) |
|
||||||
| `plugins:write` | `plugins:*` <br> `plugins:id:*` | Edit settings for one or more plugins. |
|
| `plugins:install` | n/a | Install and uninstall plugins. |
|
||||||
| `provisioning:reload` | `provisioners:*` | Reload provisioning files. To find the exact scope for specific provisioner, see [Scope definitions]({{< relref "#scope-definitions" >}}). |
|
| `plugins:write` | `plugins:*` <br> `plugins:id:*` | Edit settings for one or more plugins. |
|
||||||
| `reports:create` | n/a | Create reports. |
|
| `provisioning:reload` | `provisioners:*` | Reload provisioning files. To find the exact scope for specific provisioner, see [Scope definitions]({{< relref "#scope-definitions" >}}). |
|
||||||
| `reports:write` | `reports:*` <br> `reports:id:*` | Update reports. |
|
| `reports:create` | n/a | Create reports. |
|
||||||
| `reports.settings:read` | n/a | Read report settings. |
|
| `reports:write` | `reports:*` <br> `reports:id:*` | Update reports. |
|
||||||
| `reports.settings:write` | n/a | Update report settings. |
|
| `reports.settings:read` | n/a | Read report settings. |
|
||||||
| `reports:delete` | `reports:*` <br> `reports:id:*` | Delete reports. |
|
| `reports.settings:write` | n/a | Update report settings. |
|
||||||
| `reports:read` | `reports:*` | List all available reports or get a specific report. |
|
| `reports:delete` | `reports:*` <br> `reports:id:*` | Delete reports. |
|
||||||
| `reports:send` | `reports:*` | Send a report email. |
|
| `reports:read` | `reports:*` | List all available reports or get a specific report. |
|
||||||
| `roles:delete` | `permissions:type:delegate` | Delete a custom role. |
|
| `reports:send` | `reports:*` | Send a report email. |
|
||||||
| `roles:read` | `roles:*` <br> `roles:uid:*` | List roles and read a specific with its permissions. |
|
| `roles:delete` | `permissions:type:delegate` | Delete a custom role. |
|
||||||
| `roles:write` | `permissions:type:delegate` | Create or update a custom role. |
|
| `roles:read` | `roles:*` <br> `roles:uid:*` | List roles and read a specific with its permissions. |
|
||||||
| `roles:write` | `permissions:type:escalate` | Reset basic roles to their default permissions. |
|
| `roles:write` | `permissions:type:delegate` | Create or update a custom role. |
|
||||||
| `server.stats:read` | n/a | Read Grafana instance statistics. |
|
| `roles:write` | `permissions:type:escalate` | Reset basic roles to their default permissions. |
|
||||||
| `serviceaccounts:write` | `serviceaccounts:*` | Create Grafana service accounts. |
|
| `server.stats:read` | n/a | Read Grafana instance statistics. |
|
||||||
| `serviceaccounts:create` | n/a | Update Grafana service accounts. |
|
| `serviceaccounts:write` | `serviceaccounts:*` | Create Grafana service accounts. |
|
||||||
| `serviceaccounts:delete` | `serviceaccounts:*` | Delete Grafana service accounts. |
|
| `serviceaccounts:create` | n/a | Update Grafana service accounts. |
|
||||||
| `serviceaccounts:read` | `serviceaccounts:*` | Read Grafana service accounts. |
|
| `serviceaccounts:delete` | `serviceaccounts:*` | Delete Grafana service accounts. |
|
||||||
| `serviceaccounts.permissions:write` | `serviceaccounts:*` | Update Grafana service account permissions to control who can do what with the service account. |
|
| `serviceaccounts:read` | `serviceaccounts:*` | Read Grafana service accounts. |
|
||||||
| `serviceaccounts.permissions:read` | `serviceaccounts:*` | Read Grafana service account permissions to see who can do what with the service account. |
|
| `serviceaccounts.permissions:write` | `serviceaccounts:*` | Update Grafana service account permissions to control who can do what with the service account. |
|
||||||
| `settings:read` | `settings:*`<br>`settings:auth.saml:*`<br>`settings:auth.saml:enabled` (property level) | Read the [Grafana configuration settings]({{< relref "../../../../setup-grafana/configure-grafana/" >}}) |
|
| `serviceaccounts.permissions:read` | `serviceaccounts:*` | Read Grafana service account permissions to see who can do what with the service account. |
|
||||||
| `settings:write` | `settings:*`<br>`settings:auth.saml:*`<br>`settings:auth.saml:enabled` (property level) | Update any Grafana configuration settings that can be [updated at runtime]({{< relref "../../../../setup-grafana/configure-grafana/settings-updates-at-runtime" >}}). |
|
| `settings:read` | `settings:*`<br>`settings:auth.saml:*`<br>`settings:auth.saml:enabled` (property level) | Read the [Grafana configuration settings]({{< relref "../../../../setup-grafana/configure-grafana/" >}}) |
|
||||||
| `status:accesscontrol` | `services:accesscontrol` | Get access-control enabled status. |
|
| `settings:write` | `settings:*`<br>`settings:auth.saml:*`<br>`settings:auth.saml:enabled` (property level) | Update any Grafana configuration settings that can be [updated at runtime]({{< relref "../../../../setup-grafana/configure-grafana/settings-updates-at-runtime" >}}). |
|
||||||
| `teams.permissions:read` | `teams:*`<br>`teams:id:*` | Read members and External Group Synchronization setup for teams. |
|
| `status:accesscontrol` | `services:accesscontrol` | Get access-control enabled status. |
|
||||||
| `teams.permissions:write` | `teams:*`<br>`teams:id:*` | Add, remove and update members and manage External Group Synchronization setup for teams. |
|
| `teams.permissions:read` | `teams:*`<br>`teams:id:*` | Read members and Team Sync setup for teams. |
|
||||||
| `teams.roles:add` | `permissions:type:delegate` | Assign a role to a team. |
|
| `teams.permissions:write` | `teams:*`<br>`teams:id:*` | Add, remove and update members and manage Team Sync setup for teams. |
|
||||||
| `teams.roles:read` | `teams:*` | List roles assigned directly to a team. |
|
| `teams.roles:add` | `permissions:type:delegate` | Assign a role to a team. |
|
||||||
| `teams.roles:remove` | `permissions:type:delegate` | Unassign a role from a team. |
|
| `teams.roles:read` | `teams:*` | List roles assigned directly to a team. |
|
||||||
| `teams:create` | n/a | Create teams. |
|
| `teams.roles:remove` | `permissions:type:delegate` | Unassign a role from a team. |
|
||||||
| `teams:delete` | `teams:*`<br>`teams:id:*` | Delete one or more teams. |
|
| `teams:create` | n/a | Create teams. |
|
||||||
| `teams:read` | `teams:*`<br>`teams:id:*` | Read one or more teams and team preferences. |
|
| `teams:delete` | `teams:*`<br>`teams:id:*` | Delete one or more teams. |
|
||||||
| `teams:write` | `teams:*`<br>`teams:id:*` | Update one or more teams and team preferences. |
|
| `teams:read` | `teams:*`<br>`teams:id:*` | Read one or more teams and team preferences. |
|
||||||
| `users.authtoken:read` | `global.users:*` <br> `global.users:id:*` | List authentication tokens that are assigned to a user. |
|
| `teams:write` | `teams:*`<br>`teams:id:*` | Update one or more teams and team preferences. |
|
||||||
| `users.authtoken:write` | `global.users:*` <br> `global.users:id:*` | Update authentication tokens that are assigned to a user. |
|
| `users.authtoken:read` | `global.users:*` <br> `global.users:id:*` | List authentication tokens that are assigned to a user. |
|
||||||
| `users.password:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s password. |
|
| `users.authtoken:write` | `global.users:*` <br> `global.users:id:*` | Update authentication tokens that are assigned to a user. |
|
||||||
| `users.permissions:read` | `users:*` | List permissions of a user. |
|
| `users.password:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s password. |
|
||||||
| `users.permissions:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s organization-level permissions. |
|
| `users.permissions:read` | `users:*` | List permissions of a user. |
|
||||||
| `users.quotas:read` | `global.users:*` <br> `global.users:id:*` | List a user’s quotas. |
|
| `users.permissions:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s organization-level permissions. |
|
||||||
| `users.quotas:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s quotas. |
|
| `users.quotas:read` | `global.users:*` <br> `global.users:id:*` | List a user’s quotas. |
|
||||||
| `users.roles:add` | `permissions:type:delegate` | Assign a role to a user or a service account. |
|
| `users.quotas:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s quotas. |
|
||||||
| `users.roles:read` | `users:*` | List roles assigned directly to a user or a service account. |
|
| `users.roles:add` | `permissions:type:delegate` | Assign a role to a user or a service account. |
|
||||||
| `users.roles:remove` | `permissions:type:delegate` | Unassign a role from a user or a service account. |
|
| `users.roles:read` | `users:*` | List roles assigned directly to a user or a service account. |
|
||||||
| `users:create` | n/a | Create a user. |
|
| `users.roles:remove` | `permissions:type:delegate` | Unassign a role from a user or a service account. |
|
||||||
| `users:delete` | `global.users:*` <br> `global.users:id:*` | Delete a user. |
|
| `users:create` | n/a | Create a user. |
|
||||||
| `users:disable` | `global.users:*` <br> `global.users:id:*` | Disable a user. |
|
| `users:delete` | `global.users:*` <br> `global.users:id:*` | Delete a user. |
|
||||||
| `users:enable` | `global.users:*` <br> `global.users:id:*` | Enable a user. |
|
| `users:disable` | `global.users:*` <br> `global.users:id:*` | Disable a user. |
|
||||||
| `users:logout` | `global.users:*` <br> `global.users:id:*` | Sign out a user. |
|
| `users:enable` | `global.users:*` <br> `global.users:id:*` | Enable a user. |
|
||||||
| `users:read` | `global.users:*` | Read or search user profiles. |
|
| `users:logout` | `global.users:*` <br> `global.users:id:*` | Sign out a user. |
|
||||||
| `users:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s profile. |
|
| `users:read` | `global.users:*` | Read or search user profiles. |
|
||||||
|
| `users:write` | `global.users:*` <br> `global.users:id:*` | Update a user’s profile. |
|
||||||
|
|
||||||
### Grafana OnCall action definitions (beta)
|
### Grafana OnCall action definitions (beta)
|
||||||
|
|
||||||
@@ -193,7 +196,7 @@ The following list contains role-based access control scopes.
|
|||||||
| `apikeys:*`<br>`apikeys:id:*` | Restrict an action to a set of API keys. For example, `apikeys:*` matches any API key, `apikey:id:1` matches the API key whose id is `1`. |
|
| `apikeys:*`<br>`apikeys:id:*` | Restrict an action to a set of API keys. For example, `apikeys:*` matches any API key, `apikey:id:1` matches the API key whose id is `1`. |
|
||||||
| `dashboards:*`<br>`dashboards:uid:*` | Restrict an action to a set of dashboards. For example, `dashboards:*` matches any dashboard, and `dashboards:uid:1` matches the dashboard whose UID is `1`. |
|
| `dashboards:*`<br>`dashboards:uid:*` | Restrict an action to a set of dashboards. For example, `dashboards:*` matches any dashboard, and `dashboards:uid:1` matches the dashboard whose UID is `1`. |
|
||||||
| `datasources:*`<br>`datasources:uid:*` | Restrict an action to a set of data sources. For example, `datasources:*` matches any data source, and `datasources:uid:1` matches the data source whose UID is `1`. |
|
| `datasources:*`<br>`datasources:uid:*` | Restrict an action to a set of data sources. For example, `datasources:*` matches any data source, and `datasources:uid:1` matches the data source whose UID is `1`. |
|
||||||
| `folders:*`<br>`folders:uid:*` | Restrict an action to a set of folders. For example, `folders:*` matches any folder, and `folders:uid:1` matches the folder whose UID is `1`. |
|
| `folders:*`<br>`folders:uid:*` | Restrict an action to a set of folders. For example, `folders:*` matches any folder, and `folders:uid:1` matches the folder whose UID is `1`. Note that permissions granted to a folder cascade down to subfolders located under it |
|
||||||
| `global.users:*` <br> `global.users:id:*` | Restrict an action to a set of global users. For example, `global.users:*` matches any user and `global.users:id:1` matches the user whose ID is `1`. |
|
| `global.users:*` <br> `global.users:id:*` | Restrict an action to a set of global users. For example, `global.users:*` matches any user and `global.users:id:1` matches the user whose ID is `1`. |
|
||||||
| `orgs:*` <br> `orgs:id:*` | Restrict an action to a set of organizations. For example, `orgs:*` matches any organization and `orgs:id:1` matches the organization whose ID is `1`. |
|
| `orgs:*` <br> `orgs:id:*` | Restrict an action to a set of organizations. For example, `orgs:*` matches any organization and `orgs:id:1` matches the organization whose ID is `1`. |
|
||||||
| `permissions:type:delegate` | The scope is only applicable for roles associated with the Access Control itself and indicates that you can delegate your permissions only, or a subset of it, by creating a new role or making an assignment. |
|
| `permissions:type:delegate` | The scope is only applicable for roles associated with the Access Control itself and indicates that you can delegate your permissions only, or a subset of it, by creating a new role or making an assignment. |
|
||||||
@@ -207,3 +210,4 @@ The following list contains role-based access control scopes.
|
|||||||
| `settings:*` | Restrict an action to a subset of settings. For example, `settings:*` matches all settings, `settings:auth.saml:*` matches all SAML settings, and `settings:auth.saml:enabled` matches the enable property on the SAML settings. |
|
| `settings:*` | Restrict an action to a subset of settings. For example, `settings:*` matches all settings, `settings:auth.saml:*` matches all SAML settings, and `settings:auth.saml:enabled` matches the enable property on the SAML settings. |
|
||||||
| `teams:*` <br> `teams:id:*` | Restrict an action to a set of teams from an organization. For example, `teams:*` matches any team and `teams:id:1` matches the team whose ID is `1`. |
|
| `teams:*` <br> `teams:id:*` | Restrict an action to a set of teams from an organization. For example, `teams:*` matches any team and `teams:id:1` matches the team whose ID is `1`. |
|
||||||
| `users:*` <br> `users:id:*` | Restrict an action to a set of users from an organization. For example, `users:*` matches any user and `users:id:1` matches the user whose ID is `1`. |
|
| `users:*` <br> `users:id:*` | Restrict an action to a set of users from an organization. For example, `users:*` matches any user and `users:id:1` matches the user whose ID is `1`. |
|
||||||
|
| `n/a` | `n/a` means not applicable. If an action has `n/a` specified for the scope, then the action does not require a scope. For example, the `teams:create` action does not require a scope and allows users to create teams. |
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ We've compiled the following permissions rollout scenarios based on current Graf
|
|||||||
### Provide internal viewer employees with the ability to use Explore, but prevent external viewer contractors from using Explore
|
### Provide internal viewer employees with the ability to use Explore, but prevent external viewer contractors from using Explore
|
||||||
|
|
||||||
1. In Grafana, create a team with the name `Internal employees`.
|
1. In Grafana, create a team with the name `Internal employees`.
|
||||||
1. Assign the `fixed:datasources:querier` role to the `Internal employees` team.
|
1. Assign the `fixed:datasources:explorer` role to the `Internal employees` team.
|
||||||
1. Add internal employees to the `Internal employees` team, or map them from a SAML, LDAP, or Oauth team using [Team Sync]({{< relref "../../../../setup-grafana/configure-security/configure-team-sync/" >}}).
|
1. Add internal employees to the `Internal employees` team, or map them from a SAML, LDAP, or Oauth team using [Team Sync]({{< relref "../../../../setup-grafana/configure-security/configure-team-sync/" >}}).
|
||||||
1. Assign the viewer role to both internal employees and contractors.
|
1. Assign the viewer role to both internal employees and contractors.
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,11 @@ keywords:
|
|||||||
- configuration
|
- configuration
|
||||||
- server
|
- server
|
||||||
- settings
|
- settings
|
||||||
title: Stats and license
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
title: View server statistics and license
|
||||||
weight: 400
|
weight: 400
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -21,11 +25,11 @@ This setting contains information about tools that Grafana Server Admins can use
|
|||||||
|
|
||||||
## View Grafana server settings
|
## View Grafana server settings
|
||||||
|
|
||||||
> Refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control/" >}}) in Grafana Enterprise to understand how you can control access with RBAC permissions.
|
> Refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control" >}}) in Grafana Enterprise to understand how you can control access with RBAC permissions.
|
||||||
|
|
||||||
If you are a Grafana server administrator, use the Settings tab to view the settings that are applied to your Grafana server via the [Configuration]({{< relref "../../setup-grafana/configure-grafana/#config-file-locations" >}}) file and any environmental variables.
|
If you are a Grafana server administrator, use the Settings tab to view the settings that are applied to your Grafana server via the [Configuration]({{< relref "../../setup-grafana/configure-grafana#configuration-file-location" >}}) file and any environmental variables.
|
||||||
|
|
||||||
> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions/#grafana-server-administrators" >}}).
|
> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions#grafana-server-administrators" >}}).
|
||||||
|
|
||||||
### View server settings
|
### View server settings
|
||||||
|
|
||||||
@@ -34,15 +38,15 @@ If you are a Grafana server administrator, use the Settings tab to view the sett
|
|||||||
|
|
||||||
### Available settings
|
### Available settings
|
||||||
|
|
||||||
For a full list of server settings, refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana/" >}}).
|
For a full list of server settings, refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana#server" >}}).
|
||||||
|
|
||||||
## View Grafana server stats
|
## View Grafana server stats
|
||||||
|
|
||||||
> Refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control/" >}}) in Grafana Enterprise to understand how you can control access with RBAC permissions.
|
> Refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control" >}}) in Grafana Enterprise to understand how you can control access with RBAC permissions.
|
||||||
|
|
||||||
If you are a Grafana server admin, then you can view useful statistics about your Grafana server in the Stats & Licensing tab.
|
If you are a Grafana server admin, then you can view useful statistics about your Grafana server in the Stats & Licensing tab.
|
||||||
|
|
||||||
> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions/#grafana-server-administrators" >}}).
|
> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions#grafana-server-administrators" >}}).
|
||||||
|
|
||||||
### View server stats
|
### View server stats
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,11 @@
|
|||||||
aliases:
|
aliases:
|
||||||
- about-alerting/
|
- about-alerting/
|
||||||
- unified-alerting/alerting/
|
- unified-alerting/alerting/
|
||||||
|
cascade:
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- oss
|
||||||
title: Alerting
|
title: Alerting
|
||||||
weight: 114
|
weight: 114
|
||||||
---
|
---
|
||||||
@@ -64,8 +69,8 @@ With mute timings, you can specify a time interval when you don’t want new not
|
|||||||
|
|
||||||
## Useful links
|
## Useful links
|
||||||
|
|
||||||
- [Fundamental concepts]({{< relref "fundamentals/" >}}) of Grafana Alerting.
|
- [Fundamental concepts]({{< relref "/docs/grafana/latest/alerting/fundamentals" >}}) of Grafana Alerting.
|
||||||
|
|
||||||
- [Role-based access control]({{< relref "../administration/roles-and-permissions/access-control/" >}}) in Grafana Enterprise.
|
- [Role-based access control]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control" >}}) in Grafana Enterprise.
|
||||||
|
|
||||||
- [High availability](https://grafana.com/docs/grafana/next/alerting/fundamentals/high-availability/)
|
- [High availability]({{< relref "/docs/grafana/latest/alerting/fundamentals/high-availability" >}})
|
||||||
|
|||||||
@@ -21,22 +21,28 @@ Watch this video to learn more about creating alerts: {{< vimeo 720001934 >}}
|
|||||||
## Add Grafana managed rule
|
## Add Grafana managed rule
|
||||||
|
|
||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
||||||
1. Click **New alert rule**. The new alerting rule page opens where the Grafana managed alerts option is selected by default.
|
1. Click **Create alert rule**. The new alerting rule page opens where the Grafana managed alerts option is selected by default.
|
||||||
1. In Step 1, add the rule name.
|
1. In Step 1, add the rule name.
|
||||||
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
|
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
|
||||||
1. In Step 2, add queries and expressions to evaluate, and then select the alert condition.
|
1. In Step 2, add queries and expressions to evaluate, and then select the alert condition.
|
||||||
- For queries, select a data source from the drop-down.
|
- For queries, select a data source from the drop-down.
|
||||||
- Add one or more [queries]({{< relref "../../panels-visualizations/query-transform-data/#add-a-query/" >}}) or [expressions]({{< relref "../../panels-visualizations/query-transform-data/expression-queries/" >}}).
|
- Add one or more [queries]({{< relref "/docs/grafana/latest/panels-visualizations/query-transform-data#add-a-query" >}}) or [expressions]({{< relref "/docs/grafana/latest/panels-visualizations/query-transform-data/expression-queries" >}}).
|
||||||
- For each expression, select either **Classic condition** to create a single alert rule, or choose from **Math**, **Reduce**, **Resample** options to generate separate alert for each series. For details on these options, see [Single and multi dimensional rule](#single-and-multi-dimensional-rule).
|
- For each expression, select either **Classic condition** to create a single alert rule, or choose from **Math**, **Reduce**, **Resample** options to generate separate alert for each series. For details on these options, see [Single and multi dimensional rule](#single-and-multi-dimensional-rule).
|
||||||
- Click **Run queries** to verify that the query is successful.
|
- Click **Run queries** to verify that the query is successful.
|
||||||
- Next, select the query or expression for your alert condition.
|
- Next, select the query or expression for your alert condition.
|
||||||
1. In Step 3, specify the alert evaluation interval.
|
1. In Step 3, specify the alert evaluation interval.
|
||||||
|
|
||||||
- From the **Condition** drop-down, select the query or expression to trigger the alert rule.
|
- From the **Condition** drop-down, select the query or expression to trigger the alert rule.
|
||||||
- For **Evaluate every**, specify the frequency of evaluation. Must be a multiple of 10 seconds. For examples, `1m`, `30s`.
|
- For **Evaluate every**, specify the frequency of evaluation. Must be a multiple of 10 seconds. For examples, `1m`, `30s`.
|
||||||
- For **Evaluate for**, specify the duration for which the condition must be true before an alert fires.
|
- For **Evaluate for**, specify the duration for which the condition must be true before an alert fires.
|
||||||
> **Note:** Once a condition is breached, the alert goes into the Pending state. If the condition remains breached for the duration specified, the alert transitions to the `Firing` state, otherwise it reverts back to the `Normal` state.
|
> **Note:** Once a condition is breached, the alert goes into the Pending state. If the condition remains breached for the duration specified, the alert transitions to the `Firing` state, otherwise it reverts back to the `Normal` state.
|
||||||
- In **Configure no data and error handling**, configure alerting behavior in the absence of data. Use the guidelines in [No data and error handling](#no-data-and-error-handling).
|
- In **Configure no data and error handling**, configure alerting behavior in the absence of data. Use the guidelines in [No data and error handling](#no-data-and-error-handling).
|
||||||
- Click **Preview alerts** to check the result of running the query at this moment. Preview excludes no data and error handling.
|
- Click **Preview alerts** to check the result of running the query at this moment. Preview excludes no data and error handling.
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
|
||||||
|
You can pause alert rule evaluation to prevent noisy alerting while tuning your alerts. Pausing stops alert rule evaluation and does not create any alert instances. This is different to mute timings, which stop notifications from being delivered, but still allow for alert rule evaluation and the creation of alert instances.
|
||||||
|
|
||||||
1. In Step 4, add the storage location, rule group, as well as additional metadata associated with the rule.
|
1. In Step 4, add the storage location, rule group, as well as additional metadata associated with the rule.
|
||||||
- From the **Folder** drop-down, select the folder where you want to store the rule.
|
- From the **Folder** drop-down, select the folder where you want to store the rule.
|
||||||
- For **Group**, specify a pre-defined group. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.
|
- For **Group**, specify a pre-defined group. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.
|
||||||
@@ -68,7 +74,7 @@ To generate a separate alert for each series, create a multi-dimensional rule. U
|
|||||||
|
|
||||||
#### Rule with classic condition
|
#### Rule with classic condition
|
||||||
|
|
||||||
For more information, see [expressions documentation]({{< relref "../../panels-visualizations/query-transform-data/expression-queries/" >}}).
|
For more information, see [expressions documentation]({{< relref "/docs/grafana/latest/panels-visualizations/query-transform-data/expression-queries" >}}).
|
||||||
|
|
||||||
### No data and error handling
|
### No data and error handling
|
||||||
|
|
||||||
@@ -81,7 +87,7 @@ Configure alerting behavior in the absence of data using information in the foll
|
|||||||
| Ok | Set alert rule state to `Normal`. |
|
| Ok | Set alert rule state to `Normal`. |
|
||||||
|
|
||||||
| Error or timeout option | Description |
|
| Error or timeout option | Description |
|
||||||
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| Alerting | Set alert rule state to `Alerting`. From Grafana 8.5, the alert rule waits for the entire duration for which the condition is true before firing. |
|
| Alerting | Set alert rule state to `Alerting`. From Grafana 8.5, the alert rule waits for the entire duration for which the condition is true before firing. |
|
||||||
| OK | Set alert rule state to `Normal` |
|
| OK | Set alert rule state to `Normal` |
|
||||||
| Error | Create a new alert `DatasourceError` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
|
| re | Error | Create a new alert `DatasourceError` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ You can create and manage recording rules for an external Grafana Mimir or Loki
|
|||||||
To create a Grafana Mimir or Loki managed recording rule
|
To create a Grafana Mimir or Loki managed recording rule
|
||||||
|
|
||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
||||||
1. Click **New alert rule**. The new alerting rule page opens where the **Grafana managed alert** option is selected by default.
|
1. Click **Create alert rule**. The new alerting rule page opens where the **Grafana managed alert** option is selected by default.
|
||||||
1. In Step 1, add the rule name. The recording name must be a Prometheus metric name and contain no whitespace.
|
1. In Step 1, add the rule name. The recording name must be a Prometheus metric name and contain no whitespace.
|
||||||
- In **Rule name**, add a descriptive name.
|
- In **Rule name**, add a descriptive name.
|
||||||
1. In Step 2, select **Mimir or Loki recording rule** option.
|
1. In Step 2, select **Mimir or Loki recording rule** option.
|
||||||
@@ -49,7 +49,7 @@ To create a Grafana Mimir or Loki managed recording rule
|
|||||||
1. Click **Save** to save the recording rule or **Save and exit** to save the recording rule and go back to the Alerting page.
|
1. Click **Save** to save the recording rule or **Save and exit** to save the recording rule and go back to the Alerting page.
|
||||||
|
|
||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
||||||
1. Click **New alert rule**.
|
1. Click **Create alert rule**.
|
||||||
1. In Step 1, add the rule name.
|
1. In Step 1, add the rule name.
|
||||||
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
|
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
|
||||||
1. In Step 2, add the type, and storage location.
|
1. In Step 2, add the type, and storage location.
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ Watch this video to learn more about how to create a Mimir managed alert rule: {
|
|||||||
## Add a Grafana Mimir or Loki managed alerting rule
|
## Add a Grafana Mimir or Loki managed alerting rule
|
||||||
|
|
||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
||||||
1. Click **New alert rule**. The new alerting rule page opens where the Grafana managed alerts option is selected by default.
|
1. Click **Create alert rule**. The new alerting rule page opens where the Grafana managed alerts option is selected by default.
|
||||||
1. In Step 1, add the rule name.
|
1. In Step 1, add the rule name.
|
||||||
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
|
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
|
||||||
1. In Step 2, select **Mimir or Loki alert** option.
|
1. In Step 2, select **Mimir or Loki alert** option.
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
description: Declare an incident from a firing alert
|
||||||
|
keywords:
|
||||||
|
- grafana
|
||||||
|
- alert rules
|
||||||
|
- incident
|
||||||
|
title: Declare an incident from a firing alert
|
||||||
|
weight: 430
|
||||||
|
---
|
||||||
|
|
||||||
|
# Declare incidents from firing alerts
|
||||||
|
|
||||||
|
Declare an incident from a firing alert to streamline your alert to incident workflow.
|
||||||
|
|
||||||
|
## Before you begin
|
||||||
|
|
||||||
|
- Ensure you have Grafana Incident installed
|
||||||
|
- You must have a firing alert
|
||||||
|
|
||||||
|
## Procedure
|
||||||
|
|
||||||
|
To declare an incident from a firing alert, complete the following steps.
|
||||||
|
|
||||||
|
1. Navigate to Alerts & Incidents -> Alerting -> Alert rules.
|
||||||
|
2. From the Alert rules list view, click the firing alert that you want to declare an incident for.
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
|
||||||
|
You can also access **Declare Incident** from the alert details page.
|
||||||
|
|
||||||
|
3. Click **Declare Incident**.
|
||||||
|
The **Declare Incident** pop-up opens in the Grafana Incident application.
|
||||||
|
4. In the **Declare Incident** pop-up, enter what's going on.
|
||||||
|
|
||||||
|
**Note**: This field is pre-filled with the name of the alert rule, but you can edit it as required.
|
||||||
|
|
||||||
|
The alert rule is also linked to the incident.
|
||||||
|
|
||||||
|
5. Select a severity.
|
||||||
|
6. Add labels, as required.
|
||||||
|
7. Click **More options** to include a channel prefix and status.
|
||||||
|
8. Click **Declare Incident**.
|
||||||
|
|
||||||
|
## Next steps
|
||||||
|
|
||||||
|
View and track the incident in the Grafana Incident application.
|
||||||
|
|
||||||
|
For more information, refer to [Grafana Incident documentation.](https://grafana.com/docs/grafana-cloud/incident/configure-settings/)
|
||||||
@@ -20,8 +20,12 @@ The Alerting page lists all existing alert rules. By default, rules are grouped
|
|||||||
|
|
||||||
The Mimir/Cortex/Loki rules section lists all rules for Mimir, Cortex, or Loki data sources. Cloud alert rules are also listed in this section.
|
The Mimir/Cortex/Loki rules section lists all rules for Mimir, Cortex, or Loki data sources. Cloud alert rules are also listed in this section.
|
||||||
|
|
||||||
|
When managing large volumes of alerts, you can use extended alert rule search capabilities to filter on folders, evaluation groups, and rules. Additionally, you can filter alert rules by their properties like labels, state, type, and health.
|
||||||
|
|
||||||
- [View and filter alert rules](#view-and-filter-alert-rules)
|
- [View and filter alert rules](#view-and-filter-alert-rules)
|
||||||
- [View alert rules](#view-alert-rules)
|
- [View alert rules](#view-alert-rules)
|
||||||
|
- [Export alert rules](#export-alert-rules)
|
||||||
|
- [View query definitions for provisioned alerts](#view-query-definitions-for-provisioned-alerts)
|
||||||
- [Grouped view](#grouped-view)
|
- [Grouped view](#grouped-view)
|
||||||
- [State view](#state-view)
|
- [State view](#state-view)
|
||||||
- [Filter alert rules](#filter-alert-rules)
|
- [Filter alert rules](#filter-alert-rules)
|
||||||
@@ -36,6 +40,18 @@ To view alerting details:
|
|||||||
|
|
||||||
{{< figure src="/static/img/docs/alerting/unified/rule-details-8-0.png" max-width="650px" caption="Alerting rule details" >}}
|
{{< figure src="/static/img/docs/alerting/unified/rule-details-8-0.png" max-width="650px" caption="Alerting rule details" >}}
|
||||||
|
|
||||||
|
From the Alert list page, you can also make copies of alert rules to help you reuse existing alert rules.
|
||||||
|
|
||||||
|
## Export alert rules
|
||||||
|
|
||||||
|
Click **Export** to create and tune an alert rule in the UI, then export to YAML or JSON, and use in the provisioning API or files. You can also export an entire rule group to review or use.
|
||||||
|
|
||||||
|
**Note:** This is supported in both the UI and provisioning API.
|
||||||
|
|
||||||
|
## View query definitions for provisioned alerts
|
||||||
|
|
||||||
|
View read-only query definitions for provisioned alerts. Check quickly if your alert rule queries are correct, without diving into your "as-code" repository for rule definitions.
|
||||||
|
|
||||||
### Grouped view
|
### Grouped view
|
||||||
|
|
||||||
Grouped view shows Grafana alert rules grouped by folder and Loki or Prometheus alert rules grouped by `namespace` + `group`. This is the default rule list view, intended for managing rules. You can expand each group to view a list of rules in this group. Expand a rule further to view its details. You can also expand action buttons and alerts resulting from the rule to view their details.
|
Grouped view shows Grafana alert rules grouped by folder and Loki or Prometheus alert rules grouped by `namespace` + `group`. This is the default rule list view, intended for managing rules. You can expand each group to view a list of rules in this group. Expand a rule further to view its details. You can also expand action buttons and alerts resulting from the rule to view their details.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ title: Explore Alerting
|
|||||||
weight: 105
|
weight: 105
|
||||||
---
|
---
|
||||||
|
|
||||||
# Explore Alerting
|
# Introduction to Alerting
|
||||||
|
|
||||||
Whether you’re starting or expanding your implementation of Grafana Alerting, learn more about the key concepts and available features that help you create, manage, and take action on your alerts and improve your team’s ability to resolve issues quickly.
|
Whether you’re starting or expanding your implementation of Grafana Alerting, learn more about the key concepts and available features that help you create, manage, and take action on your alerts and improve your team’s ability to resolve issues quickly.
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Grafana supports several alert rule types, the following sections will explain t
|
|||||||
|
|
||||||
Grafana-managed rules are the most flexible alert rule type. They allow you to create alerts that can act on data from any of your existing data sources.
|
Grafana-managed rules are the most flexible alert rule type. They allow you to create alerts that can act on data from any of your existing data sources.
|
||||||
|
|
||||||
In additional to supporting any datasource you can also add additional [expressions]({{< relref "../../../panels-visualizations/query-transform-data/expression-queries/" >}}) to transform your data and express alert conditions.
|
In addition to supporting any data source, you can add [expressions]({{< relref "/docs/grafana/latest/panels-visualizations/query-transform-data/expression-queries" >}}) to transform your data and express alert conditions.
|
||||||
|
|
||||||
## Mimir, Loki and Cortex rules
|
## Mimir, Loki and Cortex rules
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,9 @@ weight: 415
|
|||||||
|
|
||||||
# Notification templating
|
# Notification templating
|
||||||
|
|
||||||
Notifications sent via contact points are built using notification templates. Grafana's default templates are based on the [Go templating system](https://golang.org/pkg/text/template) where some fields are evaluated as text, while others are evaluated as HTML (which can affect escaping). The default template, defined in [default_template.go](https://github.com/grafana/alerting/blob/main/alerting/notifier/channels/default_template.go), is a useful reference for custom templates.
|
Notifications sent via contact points are built using notification templates. Grafana's default templates are based on the [Go templating system](https://golang.org/pkg/text/template) where some fields are evaluated as text, while others are evaluated as HTML (which can affect escaping).
|
||||||
|
|
||||||
|
The default template [default_template.go](https://github.com/grafana/alerting/blob/main/templates/default_template.go) is a useful reference for custom templates.
|
||||||
|
|
||||||
Since most of the contact point fields can be templated, you can create reusable custom templates and use them in multiple contact points.
|
Since most of the contact point fields can be templated, you can create reusable custom templates and use them in multiple contact points.
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ This topic explains why labels are a fundamental component of alerting.
|
|||||||
- The Alertmanager uses labels to match alerts for silences and alert groups in notification policies.
|
- The Alertmanager uses labels to match alerts for silences and alert groups in notification policies.
|
||||||
- The alerting UI shows labels for every alert instance generated during evaluation of that rule.
|
- The alerting UI shows labels for every alert instance generated during evaluation of that rule.
|
||||||
- Contact points can access labels to dynamically generate notifications that contain information specific to the alert that is resulting in a notification.
|
- Contact points can access labels to dynamically generate notifications that contain information specific to the alert that is resulting in a notification.
|
||||||
- You can add labels to an [alerting rule]({{< relref "../../alerting-rules/" >}}). Labels are manually configurable, use template functions, and can reference other labels. Labels added to an alerting rule take precedence in the event of a collision between labels (except in the case of [Grafana reserved labels](#grafana-reserved-labels)).
|
- You can add labels to an [alerting rule]({{< relref "/docs/grafana/latest/alerting/alerting-rules" >}}). Labels are manually configurable, use template functions, and can reference other labels. Labels added to an alerting rule take precedence in the event of a collision between labels (except in the case of [Grafana reserved labels](#grafana-reserved-labels)).
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/alerting/unified/rule-edit-details-8-0.png" max-width="550px" caption="Alert details" >}}
|
{{< figure src="/static/img/docs/alerting/unified/rule-edit-details-8-0.png" max-width="550px" caption="Alert details" >}}
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ Example: A label key/value pair `Alert! 🔔="🔥"` will become `Alert_0x1f514=
|
|||||||
# Grafana reserved labels
|
# Grafana reserved labels
|
||||||
|
|
||||||
> **Note:** Labels prefixed with `grafana_` are reserved by Grafana for special use. If a manually configured label is added beginning with `grafana_` it may be overwritten in case of collision.
|
> **Note:** Labels prefixed with `grafana_` are reserved by Grafana for special use. If a manually configured label is added beginning with `grafana_` it may be overwritten in case of collision.
|
||||||
> To stop the Grafana Alerting engine from adding a reserved label, you can disable it via the `disabled_labels` option in [unified_alerting.reserved_labels]({{< relref "../../../setup-grafana/configure-grafana/#unified_alertingreserved_labels" >}}) configuration.
|
> To stop the Grafana Alerting engine from adding a reserved label, you can disable it via the `disabled_labels` option in [unified_alerting.reserved_labels]({{< relref "/docs/grafana/latest/setup-grafana/configure-grafana#unified_alertingreserved_labels" >}}) configuration.
|
||||||
|
|
||||||
Grafana reserved labels can be used in the same way as manually configured labels. The current list of available reserved labels are:
|
Grafana reserved labels can be used in the same way as manually configured labels. The current list of available reserved labels are:
|
||||||
|
|
||||||
|
|||||||
@@ -3,249 +3,335 @@ description: Learn about templating of labels and annotations
|
|||||||
keywords:
|
keywords:
|
||||||
- grafana
|
- grafana
|
||||||
- alerting
|
- alerting
|
||||||
- guide
|
- templating
|
||||||
- fundamentals
|
- labels
|
||||||
|
- annotations
|
||||||
title: Templating labels and annotations
|
title: Templating labels and annotations
|
||||||
weight: 117
|
weight: 117
|
||||||
---
|
---
|
||||||
|
|
||||||
# Templating labels and annotations
|
# Templating labels and annotations
|
||||||
|
|
||||||
In Grafana it is possible to template labels and annotations just like in Prometheus. Those who have used Prometheus before should be familiar with `$labels` and `$value` as these variables contain the labels and value of the alert. You can use the same variables in Grafana to template labels and annotations, even if the alert does not use a Prometheus datasource.
|
In Grafana you template labels and annotations just like you would in Prometheus. If you have used Prometheus before then you should be familiar with the `$labels` and `$value` variables which contain the labels and value of the alert. You can use the same variables in Grafana, even if the alert does not use a Prometheus datasource. If you haven't used Prometheus before then don't worry as each of these variables, and how to template them, will be explained as you follow the rest of this page.
|
||||||
|
|
||||||
For example, suppose you want to create an alert rule in Grafana that fires when one of your instances is down for more than 5 minutes, and that each alert fired should have a summary annotation to tell you which instance is down:
|
## Go's templating language
|
||||||
|
|
||||||
|
Templates for labels and annotations are written in Go's templating language, [text/template](https://pkg.go.dev/text/template).
|
||||||
|
|
||||||
|
### Opening and closing tags
|
||||||
|
|
||||||
|
In text/template, templates start with `{{` and end with `}}` irrespective of whether the template prints a variable or executes control structures such as if statements. This is different from other templating languages such as Jinja where printing a variable uses `{{` and `}}` and control structures use `{%` and `%}`.
|
||||||
|
|
||||||
|
### Print
|
||||||
|
|
||||||
|
To print the value of something use `{{` and `}}`. You can print the the result of a function or the value of a variable. For example, to print the `$labels` variable you would write the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ $labels }}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Iterate over labels
|
||||||
|
|
||||||
|
To iterate over each label in `$labels` you can use a `range`. Here `$k` refers to the name and `$v` refers to the value of the current label. For example, if your query returned a label `instance=test` then `$k` would be `instance` and `$v` would be `test`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ range $k, $v := $labels }}
|
||||||
|
{{ $k }}={{ $v }}
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
## The labels, value and values variables
|
||||||
|
|
||||||
|
### The labels variable
|
||||||
|
|
||||||
|
The `$labels` variable contains the labels from the query. For example, a query that checks if an instance is down might return an instance label with the name of the instance that is down. For example, suppose you have an alert rule that fires when one of your instances has been down for more than 5 minutes. You want to add a summary to the alert that tells you which instance is down. With the `$labels` variable, you can create a summary that prints the instance label in the summary:
|
||||||
|
|
||||||
```
|
```
|
||||||
Instance {{ $labels.instance }} has been down for more than 5 minutes
|
Instance {{ $labels.instance }} has been down for more than 5 minutes
|
||||||
```
|
```
|
||||||
|
|
||||||
## Labels with dots
|
### Labels with dots
|
||||||
|
|
||||||
If the label contains a dot (full stop or period) in its name then the following will not work:
|
If the label you want to print contains a dot (full stop or period) in its name using the same dot in the template will not work:
|
||||||
|
|
||||||
```
|
```
|
||||||
Instance {{ $labels.instance.name }} has been down for more than 5 minutes
|
Instance {{ $labels.instance.name }} has been down for more than 5 minutes
|
||||||
```
|
```
|
||||||
|
|
||||||
This is because it is attempting to use a non-existing field `name` in `$labels.instance` rather than `instance.name` in `$labels`. Instead use the `index` function to print `instance.name`:
|
This is because the template is attempting to use a non-existing field called `name` in `$labels.instance`. You should instead use the `index` function, which prints the label `instance.name` in the `$labels` variable:
|
||||||
|
|
||||||
```
|
```
|
||||||
Instance {{ index $labels "instance.name" }} has been down for more than 5 minutes
|
Instance {{ index $labels "instance.name" }} has been down for more than 5 minutes
|
||||||
```
|
```
|
||||||
|
|
||||||
## Use values in labels and annotations
|
### The value variable
|
||||||
|
|
||||||
Grafana supports `$value` when templating labels and annotations. However, while `$value` in Prometheus is a floating point number contains the value of the expression, `$value` in Grafana is a string containing the labels and values of all Threshold, Reduce and Maths expressions. It does not contain the value of queries as a single query can return anywhere from 1 to 10,000s of rows or metrics.
|
The `$value` variable works different from Prometheus. In Prometheus `$value` is a floating point number containing the value of the expression, but in Grafana it is a string containing the labels and values of all Threshold, Reduce and Math expressions, and Classic Conditions for this alert rule. It does not contain the results of queries, as these can return anywhere from 10s to 10,000s of rows or metrics.
|
||||||
|
|
||||||
This `$value` variable is called the Value String. If you were to use it in the template of a summary annotation:
|
If you were to use the `$value` variable in the summary of an alert:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ $labels.instance }} has an average 95th percentile request latency above 1s: {{ $value }})
|
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ $value }})
|
||||||
```
|
```
|
||||||
|
|
||||||
you will get the following summary:
|
The summary might look something like the following:
|
||||||
|
|
||||||
```
|
```
|
||||||
http_server has an average 95th percentile request latency above 1s: [ var='B' labels={instance=http_server} value=10 ]
|
api has an over 5% of responses with 5xx errors: [ var='B' labels={service=api} value=6.789 ]
|
||||||
```
|
```
|
||||||
|
|
||||||
To get just the value of `B` you can instead use `$values`:
|
Here `var='B'` refers to the expression with the RefID B. In Grafana, all queries and expressions are identified by a RefID that identifies each query and expression in an alert rule. Similarly `labels={service=api}` refers to the labels, and `value=6.789` refers to the value.
|
||||||
|
|
||||||
|
You might have observed that there is no RefID A. That is because in most alert rules the RefID A refers to a query, and since queries can return many rows or time series they are not included in `$value`.
|
||||||
|
|
||||||
|
### The values variable
|
||||||
|
|
||||||
|
If the `$value` variable contains more information than you need, you can instead print the labels and value of individual expressions using `$values`. Unlike `$value`, the `$values` variable is a table of objects containing the labels and floating point values of each expression, indexed by their RefID.
|
||||||
|
|
||||||
|
If you were to print the value of the expression with RefID `B` in the summary of the alert:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ $labels.instance }} has an average 95th percentile request latency above 1s: {{ $values.B }}
|
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ $values.B }}%
|
||||||
```
|
```
|
||||||
|
|
||||||
and then you will get this summary:
|
The summary will contain just the value:
|
||||||
|
|
||||||
```
|
```
|
||||||
http_server has an average 95th percentile request latency above 1s: 11
|
api has an over 5% of responses with 5xx errors: 6.789%
|
||||||
```
|
```
|
||||||
|
|
||||||
## Alert rules with multiple queries, or expressions
|
However, while `{{ $values.B }}` prints the number 6.789, it is actually a string as you are printing the object that contains both the labels and value for RefID B, not the floating point value of B. To use the floating point value of RefID B you must use the `Value` field from `$values.B`. If you were to humanize the floating point value in the summary of an alert:
|
||||||
|
|
||||||
If you have an alert rule with multiple queries and expressions, or a single query with a Reduce and Math expression, like in the following example:
|
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/alerting/unified/grafana-alerting-histogram-quantile.png" class="docs-image--no-shadow" caption="An alert rule that uses histogram_quantile to compute 95th percentile" >}}
|
|
||||||
|
|
||||||
Then the Value String will not just include the value of the alert condition, but the labels and values of all Threshold, Reduce and Maths expressions.
|
|
||||||
|
|
||||||
**Example 1**: The Value String of an alert rule with a single query and Reduce expression `B`:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
[ var='B' labels={instance=http_server} value=11 ]
|
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ humanize $values.B.Value }}%
|
||||||
```
|
```
|
||||||
|
|
||||||
**Example 2**: The Value String of an alert rule with a single query, Reduce expression `B` and a Math expression `C`:
|
### No data, execution errors and timeouts
|
||||||
|
|
||||||
|
If the query in your alert rule returns no data, or fails because of a datasource error or timeout, then any Threshold, Reduce or Math expressions that use that query will also return no data or an error. When this happens these expression will be absent from `$values`. It is good practice to check that a RefID is present before using it as otherwise your template will break should your query return no data or an error. You can do this using an if statement:
|
||||||
|
|
||||||
```
|
```
|
||||||
[ var='B' labels={instance=http_server} value=11, var='C' labels={instance=http_server} value=1 ]
|
{{ if $values.B }}{{ $labels.service }} has over 5% of responses with 5xx errors: {{ humanizePercentage $values.B.Value }}{{ end }}
|
||||||
```
|
|
||||||
|
|
||||||
If you were to write a summary annotation such as:
|
|
||||||
|
|
||||||
```
|
|
||||||
{{ $labels.instance }} has an average 95th percentile request latency above 1s: {{ $values.C }})
|
|
||||||
```
|
|
||||||
|
|
||||||
You would find that because the condition of the alert `C` is a Math expression with a boolean comparison, it must return either a `0` or a `1`. What you want instead is the average of the 95th percentile, and you can get this from the reduce expression `B`:
|
|
||||||
|
|
||||||
```
|
|
||||||
{{ $labels.instance }} has an average 95th percentile request latency above 1s: {{ $values.B }})
|
|
||||||
```
|
|
||||||
|
|
||||||
## No data and execution errors or timeouts
|
|
||||||
|
|
||||||
Should query `A` return no data then the reduce expression `B` will also return no data. This means that
|
|
||||||
`{{ $values.B }}` will be nil. To ensure that labels and annotations can still be templated even when a query returns no data, we can use an if statement to check for this condition:
|
|
||||||
|
|
||||||
```
|
|
||||||
{{ if $values.B }}{{ $labels.instance }} has a 95th percentile request latency above 1s: {{ $values.B }}){{ end }}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Classic Conditions
|
## Classic Conditions
|
||||||
|
|
||||||
If the rule uses Classic Conditions instead of Reduce and Math expressions, then `$values` contains the combination of the Ref ID and position of the condition. For example, `{{ $values.A0 }}` and `{{ $values.A1 }}`.
|
If the rule uses Classic Conditions instead of Threshold, Reduce and Math expressions, then the `$values` variable is indexed by both the Ref ID and position of the condition in the Classic Condition. For example, if you have a Classic Condition with RefID B containing two conditions, then `$values` will contain two conditions `B0` and `B1`.
|
||||||
|
|
||||||
## Reference
|
```
|
||||||
|
The first condition is {{ $values.B0 }}, and the second condition is {{ $values.B1 }}
|
||||||
|
```
|
||||||
|
|
||||||
### Variables
|
## Functions
|
||||||
|
|
||||||
The following template variables are available when expanding labels and annotations:
|
|
||||||
|
|
||||||
| Name | Description |
|
|
||||||
| ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| $labels | The labels from the query or condition. For example, `{{ $labels.instance }}` and `{{ $labels.job }}`. This is unavailable when the rule uses a [classic condition]({{< relref "../../alerting-rules/create-grafana-managed-rule/#single-and-multi-dimensional-rule" >}}). |
|
|
||||||
| $values | The values of all reduce and math expressions that were evaluated for this alert rule. For example, `{{ $values.A }}`, `{{ $values.A.Labels }}` and `{{ $values.A.Value }}` where `A` is the `refID` of the reduce or math expression. If the rule uses a classic condition instead of a reduce and math expression, then `$values` contains the combination of the `refID` and position of the condition. |
|
|
||||||
| $value | The value string of the alert instance. For example, `[ var='A' labels={instance=foo} value=10 ]`. |
|
|
||||||
|
|
||||||
### Functions
|
|
||||||
|
|
||||||
The following functions are also available when expanding labels and annotations:
|
The following functions are also available when expanding labels and annotations:
|
||||||
|
|
||||||
| Name | Argument type | Return type | Description |
|
### args
|
||||||
| ----------------------------------------- | ------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| [humanize](#humanize) | number or string | string | Converts a number to a more readable format, using metric prefixes. |
|
|
||||||
| [humanize1024](#humanize1024) | number or string | string | Like humanize, but uses 1024 as the base rather than 1000. |
|
|
||||||
| [humanizeDuration](#humanizeduration) | number or string | string | Converts a duration in seconds to a more readable format. |
|
|
||||||
| [humanizePercentage](#humanizepercentage) | number or string | string | Converts a ratio value to a fraction of 100. |
|
|
||||||
| [humanizeTimestamp](#humanizetimestamp) | number or string | string | Converts a Unix timestamp in seconds to a more readable format. |
|
|
||||||
| [title](#title) | string | string | strings.Title, capitalises first character of each word. |
|
|
||||||
| [toUpper](#toupper) | string | string | strings.ToUpper, converts all characters to upper case. |
|
|
||||||
| [toLower](#tolower) | string | string | strings.ToLower, converts all characters to lower case. |
|
|
||||||
| [match](#match) | pattern, text | boolean | regexp.MatchString Tests for a unanchored regexp match. |
|
|
||||||
| [reReplaceAll](#rereplaceall) | pattern, replacement, text | string | Regexp.ReplaceAllString Regexp substitution, unanchored. |
|
|
||||||
| [graphLink](#graphlink) | string - JSON Object with `"expr"` and `"datasource"` fields | string | Returns the path to graphical view in [Explore](https://grafana.com/docs/grafana/latest/explore/) for the given expression and data source. |
|
|
||||||
| [tableLink](#tablelink) | string- JSON Object with `"expr"` and `"datasource"` fields | string | Returns the path to tabular view in [Explore](https://grafana.com/docs/grafana/latest/explore/) for the given expression and data source. |
|
|
||||||
| [args](#args) | []interface{} | map[string]interface{} | Converts a list of objects to a map with keys, for example, arg0, arg1. Use this function to pass multiple arguments to templates. |
|
|
||||||
| [externalURL](#externalurl) | nothing | string | Returns a string representing the external URL. |
|
|
||||||
| [pathPrefix](#pathprefix) | nothing | string | Returns the path of the external URL. |
|
|
||||||
|
|
||||||
#### humanize
|
The `args` function translates a list of objects to a map with keys arg0, arg1 etc. This is intended to allow multiple arguments to be passed to templates.
|
||||||
|
|
||||||
**Template string** `{ humanize $value }`
|
#### Example
|
||||||
|
|
||||||
**Input** `1234567.0`
|
```
|
||||||
|
{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}
|
||||||
|
```
|
||||||
|
|
||||||
**Expected** `1.235M`
|
```
|
||||||
|
1 2
|
||||||
|
```
|
||||||
|
|
||||||
#### humanize1024
|
### externalURL
|
||||||
|
|
||||||
**TemplateString** `{ humanize1024 $value } `
|
The `externalURL` function returns the external URL of the Grafana server as configured in the ini file(s).
|
||||||
|
|
||||||
**Input** `1048576.0`
|
#### Example
|
||||||
|
|
||||||
**Expected** `1Mi`
|
```
|
||||||
|
{{ externalURL }}
|
||||||
|
```
|
||||||
|
|
||||||
#### humanizeDuration
|
```
|
||||||
|
https://example.com/grafana
|
||||||
|
```
|
||||||
|
|
||||||
**TemplateString** `{ humanizeDuration $value }`
|
### graphLink
|
||||||
|
|
||||||
**Input** `899.99`
|
The `graphLink` function returns the path to the graphical view in [Explore](https://grafana.com/docs/grafana/latest/explore/) for the given expression and data source.
|
||||||
|
|
||||||
**Expected** `14m 59s`
|
#### Example
|
||||||
|
|
||||||
#### humanizePercentage
|
```
|
||||||
|
{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
|
||||||
|
```
|
||||||
|
|
||||||
**TemplateString** `{ humanizePercentage $value }`
|
```
|
||||||
|
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]
|
||||||
|
```
|
||||||
|
|
||||||
**Input** `0.1234567`
|
### humanize
|
||||||
|
|
||||||
**Expected** `12.35%`
|
The `humanize` function humanizes decimal numbers.
|
||||||
|
|
||||||
#### humanizeTimestamp
|
#### Example
|
||||||
|
|
||||||
**TemplateString** `{ $value | humanizeTimestamp }`
|
```
|
||||||
|
{{ humanize 1000.0 }}
|
||||||
|
```
|
||||||
|
|
||||||
**Input** `1435065584.128`
|
```
|
||||||
|
1k
|
||||||
|
```
|
||||||
|
|
||||||
**Expected** `2015-06-23 13:19:44.128 +0000 UTC`
|
### humanize1024
|
||||||
|
|
||||||
#### title
|
The `humanize1024` works similar to `humanize` but but uses 1024 as the base rather than 1000.
|
||||||
|
|
||||||
**TemplateString** `{ $value | title }`
|
#### Example
|
||||||
|
|
||||||
**Input** `aa bb CC`
|
```
|
||||||
|
{{ humanize1024 1024.0 }}
|
||||||
|
```
|
||||||
|
|
||||||
**Expected** `Aa Bb Cc`
|
```
|
||||||
|
1ki
|
||||||
|
```
|
||||||
|
|
||||||
#### toUpper
|
### humanizeDuration
|
||||||
|
|
||||||
**TemplateString** `{ $value | toUpper }`
|
The `humanizeDuration` function humanizes a duration in seconds.
|
||||||
|
|
||||||
**Input** `aa bb CC`
|
#### Example
|
||||||
|
|
||||||
**Expected** `AA BB CC`
|
```
|
||||||
|
{{ humanizeDuration 60.0 }}
|
||||||
|
```
|
||||||
|
|
||||||
#### toLower
|
```
|
||||||
|
1m 0s
|
||||||
|
```
|
||||||
|
|
||||||
**TemplateString** `{ $value | toLower }`
|
### humanizePercentage
|
||||||
|
|
||||||
**Input** `aA bB CC`
|
The `humanizePercentage` function humanizes a ratio value to a percentage.
|
||||||
|
|
||||||
**Expected** `aa bb cc`
|
#### Example
|
||||||
|
|
||||||
#### match
|
```
|
||||||
|
{{ humanizePercentage 0.2 }}
|
||||||
|
```
|
||||||
|
|
||||||
**TemplateString** `{ match "a+" $labels.instance }`
|
```
|
||||||
|
20%
|
||||||
|
```
|
||||||
|
|
||||||
**Input** `aa`
|
### humanizeTimestamp
|
||||||
|
|
||||||
**Expected** `true`
|
The `humanizeTimestamp` function humanizes a Unix timestamp.
|
||||||
|
|
||||||
#### reReplaceAll
|
#### Example
|
||||||
|
|
||||||
**TemplateString** `{{ reReplaceAll "localhost:(.*)" "my.domain:$1" $labels.instance }}`
|
```
|
||||||
|
{{ humanizeTimestamp 1577836800.0 }}
|
||||||
|
```
|
||||||
|
|
||||||
**Input** `localhost:3000`
|
```
|
||||||
|
2020-01-01 00:00:00 +0000 UTC
|
||||||
|
```
|
||||||
|
|
||||||
**Expected** `my.domain:3000`
|
### match
|
||||||
|
|
||||||
#### graphLink
|
The `match` function matches the text against a regular expression pattern.
|
||||||
|
|
||||||
**TemplateString** `{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}`
|
#### Example
|
||||||
|
|
||||||
**Expected** `/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]`
|
```
|
||||||
|
{{ match "a.*" "abc" }}
|
||||||
|
```
|
||||||
|
|
||||||
#### tableLink
|
```
|
||||||
|
true
|
||||||
|
```
|
||||||
|
|
||||||
**TemplateString** `{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}`
|
### pathPrefix
|
||||||
|
|
||||||
**Expected** `/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]`
|
The `pathPrefix` function returns the path of the Grafana server as configured in the ini file(s).
|
||||||
|
|
||||||
#### args
|
#### Example
|
||||||
|
|
||||||
**TemplateString** `{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}`
|
```
|
||||||
|
{{ pathPrefix }}
|
||||||
|
```
|
||||||
|
|
||||||
**Expected** `1 2`
|
```
|
||||||
|
/grafana
|
||||||
|
```
|
||||||
|
|
||||||
#### externalURL
|
### tableLink
|
||||||
|
|
||||||
**TemplateString** `{ externalURL }`
|
The `tableLink` function returns the path to the tabular view in [Explore](https://grafana.com/docs/grafana/latest/explore/) for the given expression and data source.
|
||||||
|
|
||||||
**Expected** `http://localhost/path/prefix`
|
#### Example
|
||||||
|
|
||||||
#### pathPrefix
|
```
|
||||||
|
{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
|
||||||
|
```
|
||||||
|
|
||||||
**TemplateString** `{ pathPrefix }`
|
```
|
||||||
|
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]
|
||||||
|
```
|
||||||
|
|
||||||
**Expected** `/path/prefix`
|
### title
|
||||||
|
|
||||||
|
The `title` function capitalizes the first character of each word.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ title "hello, world!" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
Hello, World!
|
||||||
|
```
|
||||||
|
|
||||||
|
### toLower
|
||||||
|
|
||||||
|
The `toLower` function returns all text in lowercase.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ toLower "Hello, world!" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
hello, world!
|
||||||
|
```
|
||||||
|
|
||||||
|
### toUpper
|
||||||
|
|
||||||
|
The `toUpper` function returns all text in uppercase.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ toUpper "Hello, world!" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
HELLO, WORLD!
|
||||||
|
```
|
||||||
|
|
||||||
|
### reReplaceAll
|
||||||
|
|
||||||
|
The `reReplaceAll` function replaces text matching the regular expression.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
example.com:8080
|
||||||
|
```
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
aliases:
|
aliases:
|
||||||
- /docs/grafana/latest/alerting/contact-points/
|
- ../contact-points/
|
||||||
- /docs/grafana/latest/alerting/unified-alerting/contact-points/
|
- ../unified-alerting/contact-points/
|
||||||
- /docs/grafana/latest/alerting/fundamentals/contact-points/contact-point-types/
|
- contact-point-types/
|
||||||
description: Create or edit contact point
|
description: Create or edit contact point
|
||||||
keywords:
|
keywords:
|
||||||
- grafana
|
- grafana
|
||||||
@@ -21,9 +21,13 @@ Use contact points to define how your contacts are notified when an alert rule f
|
|||||||
|
|
||||||
You can also use notification templating to customize notification messages for contact point types.
|
You can also use notification templating to customize notification messages for contact point types.
|
||||||
|
|
||||||
## Supported contact point types
|
**Note:**
|
||||||
|
|
||||||
The following table lists the contact point types supported by Grafana.
|
If you've created an OnCall contact point in the Grafana OnCall application, you can view it in the Alerting application.
|
||||||
|
|
||||||
|
## Supported contact point integrations
|
||||||
|
|
||||||
|
The following table lists the contact point integrations supported by Grafana.
|
||||||
|
|
||||||
| Name | Type | Grafana Alertmanager | Other Alertmanagers |
|
| Name | Type | Grafana Alertmanager | Other Alertmanagers |
|
||||||
| ------------------------------------------------ | ------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------- |
|
| ------------------------------------------------ | ------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------- |
|
||||||
@@ -50,6 +54,6 @@ The following table lists the contact point types supported by Grafana.
|
|||||||
|
|
||||||
## Useful links
|
## Useful links
|
||||||
|
|
||||||
[Manage contact points](https://grafana.com/docs/grafana/next/alerting/manage-notifications/create-contact-point/)
|
[Manage contact points](/docs/grafana/latest/alerting/manage-notifications/create-contact-point/)
|
||||||
|
|
||||||
[Create and edit notification templates](https://grafana.com/docs/grafana/next/alerting/manage-notifications/create-message-template/)
|
[Create and edit notification templates](/docs/grafana/latest/alerting/manage-notifications/template-notifications/create-notification-templates/)
|
||||||
|
|||||||
@@ -23,11 +23,11 @@ Grafana managed alerts query the following backend data sources that have alerti
|
|||||||
|
|
||||||
- built-in data sources or those developed and maintained by Grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`,
|
- built-in data sources or those developed and maintained by Grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`,
|
||||||
`Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Monitor`
|
`Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Monitor`
|
||||||
- community developed backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json]({{< relref "../../developers/plugins/metadata/" >}}))
|
- community developed backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json]({{< relref "/docs/grafana/latest/developers/plugins/metadata" >}}))
|
||||||
|
|
||||||
### Metrics from the alerting engine
|
### Metrics from the alerting engine
|
||||||
|
|
||||||
The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "../../setup-grafana/set-up-grafana-monitoring/" >}}).
|
The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "/docs/grafana/latest/setup-grafana/set-up-grafana-monitoring" >}}).
|
||||||
|
|
||||||
| Metric Name | Type | Description |
|
| Metric Name | Type | Description |
|
||||||
| ------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- |
|
| ------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- |
|
||||||
|
|||||||
@@ -1,103 +0,0 @@
|
|||||||
---
|
|
||||||
aliases:
|
|
||||||
description:
|
|
||||||
keywords:
|
|
||||||
- grafana
|
|
||||||
- alerting
|
|
||||||
- images
|
|
||||||
- notifications
|
|
||||||
title: Images in notifications
|
|
||||||
---
|
|
||||||
|
|
||||||
# Images in notifications
|
|
||||||
|
|
||||||
Images in notifications helps recipients of alert notifications better understand why an alert has fired or resolved by including an image of the panel associated with the Grafana managed alert rule.
|
|
||||||
|
|
||||||
> **Note**: Images in notifications are not available for Grafana Mimir and Loki managed alert rules, or when Grafana is set up to send alert notifications to an external Alertmanager.
|
|
||||||
|
|
||||||
If Grafana is set up to send images in notifications, it takes a screenshot of the panel for the Grafana managed alert rule when either of the following happen:
|
|
||||||
|
|
||||||
1. The alert rule transitions from pending to firing
|
|
||||||
2. The alert rule transitions from firing to OK
|
|
||||||
|
|
||||||
Grafana does not support images for alert rules that are not associated with a panel. An alert rule is associated with a panel when it has both Dashboard UID and Panel ID annotations.
|
|
||||||
|
|
||||||
Images are stored in the [data]({{< relref "../setup-grafana/configure-grafana/#paths" >}}) path and so Grafana must have write-access to this path. If Grafana cannot write to this path then screenshots cannot be saved to disk and an error will be logged for each failed screenshot attempt. In addition to storing images on disk, Grafana can also store the image in an external image store such as Amazon S3, Azure Blob Storage, Google Cloud Storage and even Grafana where screenshots are stored in `public/img/attachments`. Screenshots older than `temp_data_lifetime` are deleted from disk but not the external image store. If Grafana is the external image store then screenshots are deleted from `data` but not from `public/img/attachments`.
|
|
||||||
|
|
||||||
> **Note**: It is recommended that you use an external image store, as not all contact points support uploading images from disk. It is also possible that the image on disk is deleted before an alert notification is sent if `temp_data_lifetime` is less than the `group_wait` and `group_interval` options used in Alertmanager.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
To use images in notifications, Grafana must be set up to use [image rendering]({{< relref "../setup-grafana/image-rendering/" >}}). It is also recommended that Grafana is set up to upload images to an [external image store]({{< relref "../setup-grafana/configure-grafana/#external_image_storage" >}}) such as Amazon S3, Azure Blob Storage, Google Cloud Storage or even Grafana.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
> **Note:** Grafana Cloud users can request this feature by [opening a support ticket in the Cloud Portal](https://grafana.com/profile/org#support).
|
|
||||||
|
|
||||||
If Grafana has been set up to use [image rendering]({{< relref "../setup-grafana/image-rendering/" >}}) images in notifications can be turned on via the `capture` option in `[unified_alerting.screenshots]`:
|
|
||||||
|
|
||||||
# Enable screenshots in notifications. This option requires the Grafana Image Renderer plugin.
|
|
||||||
# For more information on configuration options, refer to [rendering].
|
|
||||||
capture = true
|
|
||||||
|
|
||||||
It is recommended that `max_concurrent_screenshots` is set to a value that is less than or equal to `concurrent_render_request_limit`. The default value for both `max_concurrent_screenshots` and `concurrent_render_request_limit` is `5`:
|
|
||||||
|
|
||||||
# The maximum number of screenshots that can be taken at the same time. This option is different from
|
|
||||||
# concurrent_render_request_limit as max_concurrent_screenshots sets the number of concurrent screenshots
|
|
||||||
# that can be taken at the same time for all firing alerts where as concurrent_render_request_limit sets
|
|
||||||
# the total number of concurrent screenshots across all Grafana services.
|
|
||||||
max_concurrent_screenshots = 5
|
|
||||||
|
|
||||||
If Grafana has been set up to use an external image store, `upload_external_image_storage` should be set to `true`:
|
|
||||||
|
|
||||||
# Uploads screenshots to the local Grafana server or remote storage such as Azure, S3 and GCS. Please
|
|
||||||
# see [external_image_storage] for further configuration options. If this option is false, screenshots
|
|
||||||
# will be persisted to disk for up to temp_data_lifetime.
|
|
||||||
upload_external_image_storage = false
|
|
||||||
|
|
||||||
Restart Grafana for the changes to take affect.
|
|
||||||
|
|
||||||
## Supported notifiers
|
|
||||||
|
|
||||||
Images in notifications are supported in the following notifiers and additional support will be added in the future:
|
|
||||||
|
|
||||||
| Name | Upload images from disk | Include images from URL |
|
|
||||||
| ----------------------- | ----------------------- | ----------------------- |
|
|
||||||
| DingDing | No | No |
|
|
||||||
| Discord | Yes | Yes |
|
|
||||||
| Email | Yes | Yes |
|
|
||||||
| Google Hangouts Chat | No | Yes |
|
|
||||||
| Kafka | No | No |
|
|
||||||
| Line | No | No |
|
|
||||||
| Microsoft Teams | No | Yes |
|
|
||||||
| Opsgenie | No | Yes |
|
|
||||||
| Pagerduty | No | Yes |
|
|
||||||
| Prometheus Alertmanager | No | No |
|
|
||||||
| Pushover | Yes | No |
|
|
||||||
| Sensu Go | No | No |
|
|
||||||
| Slack | No | Yes |
|
|
||||||
| Telegram | No | No |
|
|
||||||
| Threema | No | No |
|
|
||||||
| VictorOps | No | No |
|
|
||||||
| Webhook | No | Yes |
|
|
||||||
|
|
||||||
Include images from URL refers to using the external image store.
|
|
||||||
|
|
||||||
## Metrics
|
|
||||||
|
|
||||||
Grafana provides the following metrics to observe the performance and failure rate of images in notifications.
|
|
||||||
For example, if a screenshot could not be taken within the expected time (10 seconds) then the counter `grafana_screenshot_failures_total` is updated.
|
|
||||||
|
|
||||||
- `grafana_screenshot_cache_hits_total`
|
|
||||||
- `grafana_screenshot_cache_misses_total`
|
|
||||||
- `grafana_screenshot_duration_seconds`
|
|
||||||
- `grafana_screenshot_failures_total`
|
|
||||||
- `grafana_screenshot_successes_total`
|
|
||||||
- `grafana_screenshot_upload_failures_total`
|
|
||||||
- `grafana_screenshot_upload_successes_total`
|
|
||||||
|
|
||||||
## Limitations
|
|
||||||
|
|
||||||
- Images in notifications are not available for Grafana Mimir and Loki managed alert rules, or when Grafana is set up to send alert notifications to an external Alertmanager.
|
|
||||||
- When alerts generated by different alert rules are sent in a single notification, there may be screenshots for each alert rule. This happens if an alert group contains multiple alerting rules. The order the images are attached is random. If you need to guarantee the ordering of images, make sure that your alert groups contain a single alerting rule.
|
|
||||||
- Some contact points only handle a single image. In this case, the first image associated with an alert will be attached. Because the ordering is random, this may not always be an image for the same alert rule. If you need to guarantee you receive a screenshot for a particular rule, make sure that your alert groups contain a single alerting rule.
|
|
||||||
@@ -24,13 +24,13 @@ Complete the following steps to add a contact point.
|
|||||||
|
|
||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
||||||
1. Click **Contact points** to open the page listing existing contact points.
|
1. Click **Contact points** to open the page listing existing contact points.
|
||||||
1. Click **New contact point**.
|
1. Click **Add contact point**.
|
||||||
1. From the **Alertmanager** dropdown, select an Alertmanager. By default, Grafana Alertmanager is selected.
|
1. From the **Alertmanager** dropdown, select an Alertmanager. By default, Grafana Alertmanager is selected.
|
||||||
1. In **Name**, enter a descriptive name for the contact point.
|
1. In **Name**, enter a descriptive name for the contact point.
|
||||||
1. From **Contact point integration**, select a type and fill out mandatory fields. For example, if you choose email, enter the email addresses. Or if you choose Slack, enter the Slack channel(s) and users who should be contacted.
|
1. From **Contact point integration**, select a type and fill out mandatory fields. For example, if you choose email, enter the email addresses. Or if you choose Slack, enter the Slack channel(s) and users who should be contacted.
|
||||||
1. Some contact point integrations, like email or webhook, have optional settings. In **Optional settings**, specify additional settings for the selected contact point integration.
|
1. Some contact point integrations, like email or webhook, have optional settings. In **Optional settings**, specify additional settings for the selected contact point integration.
|
||||||
1. In Notification settings, optionally select **Disable resolved message** if you do not want to be notified when an alert resolves.
|
1. In Notification settings, optionally select **Disable resolved message** if you do not want to be notified when an alert resolves.
|
||||||
1. To add another contact point integration, click **New contact point integration** and repeat steps 6 through 8.
|
1. To add another contact point integration, click **Add contact point integration** and repeat steps 6 through 8.
|
||||||
1. Click **Save contact point** to save your changes.
|
1. Click **Save contact point** to save your changes.
|
||||||
|
|
||||||
## Edit a contact point
|
## Edit a contact point
|
||||||
|
|||||||
@@ -1,175 +0,0 @@
|
|||||||
---
|
|
||||||
aliases:
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/create-message-template/
|
|
||||||
- /docs/grafana/latest/alerting/message-templating/
|
|
||||||
- /docs/grafana/latest/alerting/unified-alerting/message-templating/
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/delete-message-template/
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/edit-message-template/
|
|
||||||
- /docs/grafana/latest/alerting/manage-notifications/create-message-template/
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/example-template/
|
|
||||||
- /docs/grafana/latest/alerting/message-templating/
|
|
||||||
- /docs/grafana/latest/alerting/unified-alerting/message-templating/
|
|
||||||
- /docs/grafana/latest/alerting/fundamentals/contact-points/example-template/
|
|
||||||
- /docs/grafana/latest/alerting/contact-points/message-templating/template-data/
|
|
||||||
- /docs/grafana/latest/alerting/message-templating/template-data/
|
|
||||||
- /docs/grafana/latest/alerting/unified-alerting/message-templating/template-data/
|
|
||||||
- /docs/grafana/latest/alerting/fundamentals/contact-points/template-data/
|
|
||||||
keywords:
|
|
||||||
- grafana
|
|
||||||
- alerting
|
|
||||||
- guide
|
|
||||||
- contact point
|
|
||||||
- templating
|
|
||||||
title: Create and edit notification templates
|
|
||||||
weight: 200
|
|
||||||
---
|
|
||||||
|
|
||||||
# Create and edit notification templates
|
|
||||||
|
|
||||||
You can use notification templates to customize notification messages for the contact point types.
|
|
||||||
|
|
||||||
## Create a notification template:
|
|
||||||
|
|
||||||
To create a notification template, complete the following steps.
|
|
||||||
|
|
||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
|
||||||
2. In the Alerting page, click **Contact points** to open the page listing existing contact points.
|
|
||||||
3. From Alertmanager drop-down, select an external Alertmanager to create and manage templates for the external data source. Otherwise, keep the default option of Grafana.
|
|
||||||
{{< figure max-width="250px" src="/static/img/docs/alerting/unified/contact-points-select-am-8-0.gif" caption="Select Alertmanager" >}}
|
|
||||||
4. Click **Add template**.
|
|
||||||
5. In **Name**, add a descriptive name.
|
|
||||||
6. In **Content**, add the content of the template.
|
|
||||||
7. Click **Save template** button at the bottom of the page.
|
|
||||||
<img src="/static/img/docs/alerting/unified/templates-create-8-0.png" width="600px">
|
|
||||||
|
|
||||||
The `define` tag in the Content section assigns the template name. This tag is optional, and when omitted, the template name is derived from the **Name** field. When both are specified, it is a best practice to ensure that they are the same.
|
|
||||||
|
|
||||||
## Edit a notification template:
|
|
||||||
|
|
||||||
To edit a notification template, complete the following steps.
|
|
||||||
|
|
||||||
1. In the Alerting page, click **Contact points** to open the page listing existing contact points.
|
|
||||||
1. In the Template table, find the template you want to edit, then click the **Edit** (pen icon).
|
|
||||||
1. Make your changes, then click **Save template**.
|
|
||||||
|
|
||||||
## Delete a notification template:
|
|
||||||
|
|
||||||
To delete a notification template, complete the following steps.
|
|
||||||
|
|
||||||
1. In the Alerting page, click **Contact points** to open the page listing existing contact points.
|
|
||||||
1. In the Template table, find the template you want to delete, then click the **Delete** (trash icon).
|
|
||||||
1. In the confirmation dialog, click **Yes, delete** to delete the template.
|
|
||||||
|
|
||||||
Use caution when deleting a template since Grafana does not prevent you from deleting templates that are in use.
|
|
||||||
|
|
||||||
## Create a custom template
|
|
||||||
|
|
||||||
Here's an example of how to use a custom template. You can also use the default template included in the setup.
|
|
||||||
|
|
||||||
Step 1: Configure a template to render a single alert.
|
|
||||||
|
|
||||||
```
|
|
||||||
{{ define "myalert" }}
|
|
||||||
[{{.Status}}] {{ .Labels.alertname }}
|
|
||||||
|
|
||||||
Labels:
|
|
||||||
{{ range .Labels.SortedPairs }}
|
|
||||||
{{ .Name }}: {{ .Value }}
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
{{ if gt (len .Annotations) 0 }}
|
|
||||||
Annotations:
|
|
||||||
{{ range .Annotations.SortedPairs }}
|
|
||||||
{{ .Name }}: {{ .Value }}
|
|
||||||
{{ end }}
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
{{ if gt (len .SilenceURL ) 0 }}
|
|
||||||
Silence alert: {{ .SilenceURL }}
|
|
||||||
{{ end }}
|
|
||||||
{{ if gt (len .DashboardURL ) 0 }}
|
|
||||||
Go to dashboard: {{ .DashboardURL }}
|
|
||||||
{{ end }}
|
|
||||||
{{ end }}
|
|
||||||
```
|
|
||||||
|
|
||||||
Step 2: Configure a template to render entire notification message.
|
|
||||||
|
|
||||||
```
|
|
||||||
{{ define "mymessage" }}
|
|
||||||
{{ if gt (len .Alerts.Firing) 0 }}
|
|
||||||
{{ len .Alerts.Firing }} firing:
|
|
||||||
{{ range .Alerts.Firing }} {{ template "myalert" .}} {{ end }}
|
|
||||||
{{ end }}
|
|
||||||
{{ if gt (len .Alerts.Resolved) 0 }}
|
|
||||||
{{ len .Alerts.Resolved }} resolved:
|
|
||||||
{{ range .Alerts.Resolved }} {{ template "myalert" .}} {{ end }}
|
|
||||||
{{ end }}
|
|
||||||
{{ end }}
|
|
||||||
```
|
|
||||||
|
|
||||||
Step 3: Add `mymessage` in the notification message field.
|
|
||||||
|
|
||||||
```
|
|
||||||
Alert summary:
|
|
||||||
{{ template "mymessage" . }}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Template data
|
|
||||||
|
|
||||||
Template data is passed on to notification templates as well as sent as payload to webhook pushes.
|
|
||||||
|
|
||||||
| Name | Type | Notes |
|
|
||||||
| ----------------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| Receiver | string | Name of the contact point that the notification is being sent to. |
|
|
||||||
| Status | string | `firing` if at least one alert is firing, otherwise `resolved`. |
|
|
||||||
| Alerts | Alert | List of alert objects that are included in this notification (see below). |
|
|
||||||
| GroupLabels | KeyValue | Labels these alerts were grouped by. |
|
|
||||||
| CommonLabels | KeyValue | Labels common to all the alerts included in this notification. |
|
|
||||||
| CommonAnnotations | KeyValue | Annotations common to all the alerts included in this notification. |
|
|
||||||
| ExternalURL | string | Back link to the Grafana that sent the notification. If using external Alertmanager, back link to this Alertmanager. |
|
|
||||||
|
|
||||||
The `Alerts` type exposes functions for filtering alerts:
|
|
||||||
|
|
||||||
- `Alerts.Firing` returns a list of firing alerts.
|
|
||||||
- `Alerts.Resolved` returns a list of resolved alerts.
|
|
||||||
|
|
||||||
## Alert
|
|
||||||
|
|
||||||
| Name | Type | Notes |
|
|
||||||
| ------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| Status | string | `firing` or `resolved`. |
|
|
||||||
| Labels | KeyValue | A set of labels attached to the alert. |
|
|
||||||
| Annotations | KeyValue | A set of annotations attached to the alert. |
|
|
||||||
| StartsAt | time.Time | Time the alert started firing. |
|
|
||||||
| EndsAt | time.Time | Only set if the end time of an alert is known. Otherwise set to a configurable timeout period from the time since the last alert was received. |
|
|
||||||
| GeneratorURL | string | A back link to Grafana or external Alertmanager. |
|
|
||||||
| SilenceURL | string | Link to grafana silence for with labels for this alert pre-filled. Only for Grafana managed alerts. |
|
|
||||||
| DashboardURL | string | Link to grafana dashboard, if alert rule belongs to one. Only for Grafana managed alerts. |
|
|
||||||
| PanelURL | string | Link to grafana dashboard panel, if alert rule belongs to one. Only for Grafana managed alerts. |
|
|
||||||
| Fingerprint | string | Fingerprint that can be used to identify the alert. |
|
|
||||||
| ValueString | string | A string that contains the labels and value of each reduced expression in the alert. |
|
|
||||||
|
|
||||||
## KeyValue
|
|
||||||
|
|
||||||
`KeyValue` is a set of key/value string pairs that represent labels and annotations.
|
|
||||||
|
|
||||||
Here is an example containing two annotations:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"summary": "alert summary",
|
|
||||||
"description": "alert description"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
In addition to direct access of data (labels and annotations) stored as KeyValue, there are also methods for sorting, removing and transforming.
|
|
||||||
|
|
||||||
| Name | Arguments | Returns | Notes |
|
|
||||||
| ----------- | --------- | --------------------------------------- | ----------------------------------------------------------- |
|
|
||||||
| SortedPairs | | Sorted list of key & value string pairs |
|
|
||||||
| Remove | []string | KeyValue | Returns a copy of the Key/Value map without the given keys. |
|
|
||||||
| Names | | []string | List of label names |
|
|
||||||
| Values | | []string | List of label values |
|
|
||||||
@@ -16,7 +16,7 @@ weight: 300
|
|||||||
|
|
||||||
# Manage notification policies
|
# Manage notification policies
|
||||||
|
|
||||||
Notification policies determine how alerts are routed to contact points. Policies have a tree structure, where each policy can have one or more child policies. Each policy, except for the root policy, can also match specific alert labels. Each alert is evaluated by the root policy and subsequently by each child policy. If you enable the `Continue matching subsequent sibling nodes` option is enabled for a specific policy, then evaluation continues even after one or more matches. A parent policy’s configuration settings and contact point information govern the behavior of an alert that does not match any of the child policies. A root policy governs any alert that does not match a specific policy.
|
Notification policies determine how alerts are routed to contact points. Policies have a tree structure, where each policy can have one or more child policies. Each policy, except for the root policy, can also match specific alert labels. Each alert is evaluated by the root policy and subsequently by each child policy. If the `Continue matching subsequent sibling nodes` option is enabled for a specific policy, then evaluation continues even after one or more matches. A parent policy’s configuration settings and contact point information govern the behavior of an alert that does not match any of the child policies. A root policy governs any alert that does not match a specific policy.
|
||||||
|
|
||||||
You can configure Grafana managed notification policies as well as notification policies for an external Alertmanager data source.
|
You can configure Grafana managed notification policies as well as notification policies for an external Alertmanager data source.
|
||||||
|
|
||||||
@@ -76,6 +76,23 @@ You can configure grouping to be `group_by: [alertname]` (take note that the `en
|
|||||||
1. Make any changes using instructions in [Add new specific policy](#add-new-specific-policy).
|
1. Make any changes using instructions in [Add new specific policy](#add-new-specific-policy).
|
||||||
1. Click **Save policy**.
|
1. Click **Save policy**.
|
||||||
|
|
||||||
|
## Searching for policies
|
||||||
|
|
||||||
|
Grafana allows you to search within the tree of policies by the following:
|
||||||
|
|
||||||
|
- **Label matchers**
|
||||||
|
- **Contact Points**
|
||||||
|
|
||||||
|
To search by contact point, simply enter a part or full name you are looking for.
|
||||||
|
|
||||||
|
To search by label matchers simply enter a valid matcher in the **Search by matchers** input field. Multiple matchers can be combined with a comma (`,`).
|
||||||
|
|
||||||
|
An example of a valid matchers search input is:
|
||||||
|
|
||||||
|
`severity=high, region=~EMEA|NASA`
|
||||||
|
|
||||||
|
> All matched policies will be **exact** matches, we currently do not support regex-style or partial matching.
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
An example of an alert configuration.
|
An example of an alert configuration.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ To add a silence, complete the following steps.
|
|||||||
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
|
||||||
2. On the Alerting page, click **Silences** to open the page listing existing silences.
|
2. On the Alerting page, click **Silences** to open the page listing existing silences.
|
||||||
3. From Alertmanager drop-down, select an external Alertmanager to create and manage silences for the external data source. Otherwise, keep the default option of Grafana.
|
3. From Alertmanager drop-down, select an external Alertmanager to create and manage silences for the external data source. Otherwise, keep the default option of Grafana.
|
||||||
4. Click **New Silence** to open the Create silence page.
|
4. Click **Add Silence** to open the Create silence page.
|
||||||
5. In **Silence start and end**, select the start and end date to indicate when the silence should go into effect and expire.
|
5. In **Silence start and end**, select the start and end date to indicate when the silence should go into effect and expire.
|
||||||
6. Optionally, in **Duration**, specify how long the silence is enforced. This automatically updates the end time in the **Silence start and end** field.
|
6. Optionally, in **Duration**, specify how long the silence is enforced. This automatically updates the end time in the **Silence start and end** field.
|
||||||
7. In the **Name** and **Value** fields, enter one or more _Matching Labels_. Matchers determine which rules the silence will apply to.
|
7. In the **Name** and **Value** fields, enter one or more _Matching Labels_. Matchers determine which rules the silence will apply to.
|
||||||
|
|||||||
@@ -13,39 +13,42 @@ weight: 500
|
|||||||
|
|
||||||
Images in notifications helps recipients of alert notifications better understand why an alert has fired or resolved by including a screenshot of the panel associated with the alert.
|
Images in notifications helps recipients of alert notifications better understand why an alert has fired or resolved by including a screenshot of the panel associated with the alert.
|
||||||
|
|
||||||
> **Note**: This feature is not supported for Mimir or Loki rules, or when Grafana sends alert notifications to an external Alertmanager.
|
> **Note**: This feature is not supported in Mimir or Loki, or when Grafana is configured to send alerts to other Alertmanagers such as the Prometheus Alertmanager
|
||||||
|
|
||||||
When an alert is fired or resolved Grafana takes a screenshot of the panel associated with the alert. This is determined via the Dashboard UID and Panel ID annotations of the rule. Grafana cannot take a screenshot for alerts that are not associated with a panel.
|
When an alert is fired or resolved Grafana takes a screenshot of the panel associated with the alert. This is determined via the Dashboard UID and Panel ID annotations of the rule. Grafana cannot take a screenshot for alerts that are not associated with a panel.
|
||||||
|
|
||||||
Because a number of contact points, such as email, do not support uploading screenshots at the time of sending a notification; Grafana can also upload the screenshot to a cloud storage service such as Amazon S3, Azure Blob Storage and Google Cloud Storage, where a link to the uploaded screenshot can be added to the notification. However, if using a cloud storage service is not an option then Grafana can be its own cloud storage service such that the screenshot is available under the same domain as Grafana.
|
Grafana takes at most two screenshots for each alert: once when the alert fires and again when the alert is resolved. Screenshots are not re-taken over the lifetime of the alert, instead you should open the panel in Grafana to follow the data in real time. In addition, depending on how alerts are grouped in your notification policies, Grafana might send a notification with many screenshots of the same panel. This happens because Grafana does not know how your alerts are grouped at the time a screenshot is taken, and so acts conservatively by taking a screenshot for every alert.
|
||||||
|
|
||||||
Should either the cloud storage service, or Grafana if acting as its own cloud storage service, be protected by a firewall, gateway service or VPN, then screenshots might not be shown in notifications.
|
Once a screenshot has been taken Grafana can either upload it to a cloud storage service such as Amazon S3, Azure Blob Storage or Google Cloud Storage; upload the screenshot to it's internal web server; or upload it to the service that is receiving the notification, such as Slack. Which option you should choose depends on how your Grafana is managed and which integrations you use. More information on this can be found in Requirements.
|
||||||
|
|
||||||
How to choose between uploading screenshots at the time of sending the notification, using a cloud storage service, or using Grafana as its own cloud storage service, depends on which contact points you plan to use and whether you use a firewall, gateway service or VPN.
|
Refer to the table at the end of this page for a list of contact points and their support for images in notifications.
|
||||||
|
|
||||||
For example, if a contact point supports uploading images at the time of notification is it not required to use cloud storage. Cloud storage is required when a contact point does not support uploading images at the time of sending a notification, such as email. We don't recommend using cloud storage if the cloud storage service is behind a firewall, gateway service, or VPN, as screenshots might not be shown in notifications.
|
|
||||||
|
|
||||||
Please refer to the table at the end of this page for a list of contact points and their support for images in notifications.
|
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
To use images in notifications, Grafana must be set up to use [image rendering](https://grafana.com/docs/grafana/next/setup-grafana/image-rendering/). You can either install the image rendering plugin or run it as a remote rendering service.
|
1. To use images in notifications, Grafana must be set up to use [image rendering]({{< relref "/docs/grafana/latest/setup-grafana/image-rendering" >}}). You can either install the image rendering plugin or run it as a remote rendering service.
|
||||||
|
|
||||||
When a screenshot is taken it is saved to the [data]({{< relref "../../setup-grafana/configure-grafana/#paths" >}}) path. This is where screenshots are stored before being sent in a notification or uploaded to a cloud storage service. Grafana must have write-access to this path. If Grafana cannot write to this path then screenshots cannot be saved to disk and an error will be logged for each failed screenshot attempt.
|
2. When a screenshot is taken it is saved to the [data]({{< relref "/docs/grafana/latest/setup-grafana/configure-grafana#paths" >}}) folder, even if Grafana is configured to upload screenshots to a cloud storage service. Grafana must have write-access to this folder otherwise screenshots cannot be saved to disk and an error will be logged for each failed screenshot attempt.
|
||||||
|
|
||||||
If using a [cloud storage service](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#external_image_storage) such as Amazon S3, Azure Blob Storage or Google Cloud Storage, uploaded images need to be accessible outside of a firewall, gateway service or VPN for screenshots to be shown in notifications. Grafana will not delete screenshots from cloud storage. We recommend configuring a retention policy on the bucket to delete screenshots older than 1 month.
|
3. You should use a cloud storage service unless sending alerts to Discord, Email, Pushover, Slack or Telegram. These integrations support either embedding screenshots in the email or attaching screenshots to the notification, while other integrations must link screenshots uploaded to a cloud storage bucket. If a cloud storage service has been configured then integrations that support both will link screenshots from the cloud storage bucket instead of embedding or attaching screenshots to the notification.
|
||||||
|
|
||||||
If using Grafana as its own cloud storage service then screenshots will be saved to `static_root_path/img/attachments`. `static_root_path` is a configuration option for Grafana and can be found in `defaults.ini`. However, like when using a cloud storage service, images need to be accessible outside of a firewall, gateway service or VPN for screenshots to be shown in notifications.
|
4. If uploading screenshots to a cloud storage service such as Amazon S3, Azure Blob Storage or Google Cloud Storage; and accessing screenshots in the bucket requires authentication, logging into a VPN or corporate network; then image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN. If this happens we recommend using [integrations which support uploading images]({{<relref "#supported-contact-points">}}) or [disabling images in notifications]({{<relref "#configuration">}}) altogether.
|
||||||
|
|
||||||
When using Grafana as its own cloud storage service screenshots are copied from [data]({{< relref "../../setup-grafana/configure-grafana/#paths" >}}) to `static_root_path/img/attachments`. Screenshots older than `temp_data_lifetime` are deleted from [data]({{< relref "../../setup-grafana/configure-grafana/#paths" >}}) but not from `static_root_path/images/attachments`. To delete screenshots from `static_root_path` after a certain amount of time we recommend setting up a CRON job.
|
5. When uploading screenshots to a cloud storage service Grafana uses a random 20 character (30 characters for Azure Blob Storage) filename for each image. This makes URLs hard to guess but not impossible.
|
||||||
|
|
||||||
|
6. Grafana does not delete screenshots from cloud storage. We recommend configuring a retention policy with your cloud storage service to delete screenshots older than 1 month.
|
||||||
|
|
||||||
|
7. If Grafana is configured to upload screenshots to its internal web server, and accessing Grafana requires logging into a VPN or corporate network; image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN. If this happens we recommend using [integrations which support uploading images]({{<relref "#supported-contact-points">}}) or [disabling images in notifications]({{<relref "#configuration">}}) altogether.
|
||||||
|
|
||||||
|
8. Grafana does not delete screenshots uploaded to its internal web server. To delete screenshots from `static_root_path/images/attachments` after a certain amount of time we recommend setting up a CRON job.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
> **Note:** Grafana Cloud users can request this feature by [opening a support ticket in the Cloud Portal](https://grafana.com/profile/org#support).
|
> **Note:** Grafana Cloud users can request this feature by [opening a support ticket in the Cloud Portal](/profile/org#support).
|
||||||
|
|
||||||
Having installed either the image rendering plugin, or set up Grafana to use a remote rendering service, set `capture` in `[unified_alerting.screenshots]` to `true`:
|
Having installed either the image rendering plugin, or set up Grafana to use a remote rendering service, set `capture` in `[unified_alerting.screenshots]` to `true`:
|
||||||
|
|
||||||
# Enable screenshots in notifications. This option requires the Grafana Image Renderer plugin.
|
# Enable screenshots in notifications. You must have either installed the Grafana image rendering
|
||||||
|
# plugin, or set up Grafana to use a remote rendering service.
|
||||||
# For more information on configuration options, refer to [rendering].
|
# For more information on configuration options, refer to [rendering].
|
||||||
capture = false
|
capture = false
|
||||||
|
|
||||||
@@ -56,9 +59,9 @@ If screenshots should be uploaded to cloud storage then `upload_external_image_s
|
|||||||
# will be persisted to disk for up to temp_data_lifetime.
|
# will be persisted to disk for up to temp_data_lifetime.
|
||||||
upload_external_image_storage = false
|
upload_external_image_storage = false
|
||||||
|
|
||||||
Please see [`[external_image_storage]`](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#external_image_storage) for instructions on how to configure cloud storage. Grafana will not start if `upload_external_image_storage` is `true` and `[external_image_storage]` contains missing or invalid configuration.
|
Please see [`[external_image_storage]`]({{< relref "/docs/grafana/latest/setup-grafana/configure-grafana#external_image_storage" >}}) for instructions on how to configure cloud storage. Grafana will not start if `upload_external_image_storage` is `true` and `[external_image_storage]` contains missing or invalid configuration.
|
||||||
|
|
||||||
If Grafana is acting as its own cloud storage then `[upload_external_image_storage]` should be set to `true` and the `local` provider should be set in [`[external_image_storage]`](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#external_image_storage).
|
If Grafana is acting as its own cloud storage then `[upload_external_image_storage]` should be set to `true` and the `local` provider should be set in [`[external_image_storage]`]({{< relref "/docs/grafana/latest/setup-grafana/configure-grafana#external_image_storage" >}}).
|
||||||
|
|
||||||
Restart Grafana for the changes to take effect.
|
Restart Grafana for the changes to take effect.
|
||||||
|
|
||||||
@@ -72,37 +75,36 @@ We recommended that `max_concurrent_screenshots` is less than or equal to `concu
|
|||||||
# the total number of concurrent screenshots across all Grafana services.
|
# the total number of concurrent screenshots across all Grafana services.
|
||||||
max_concurrent_screenshots = 5
|
max_concurrent_screenshots = 5
|
||||||
|
|
||||||
## Support for images in contact points
|
## Supported contact points
|
||||||
|
|
||||||
Grafana supports a wide range of contact points with varied support for images in notifications. The table below shows the list of all contact points supported in Grafana and their support for uploading images at the time of sending the notification and images uploaded to cloud storage, including when Grafana is acting as its own cloud storage service.
|
Grafana supports a wide range of contact points with varied support for images in notifications. The table below shows the list of all contact points supported in Grafana and their support for uploading screenshots to the receiving service and referencing screenshots that have been uploaded to a cloud storage service.
|
||||||
|
|
||||||
| Name | Upload image at time of notification | Cloud storage |
|
| Name | Upload from disk | Reference from cloud storage |
|
||||||
| ----------------------- | ------------------------------------ | ------------- |
|
| ----------------------- | ---------------------------------------------------------- | -------------------------------------------------------- |
|
||||||
| DingDing | No | No |
|
| DingDing | No | No |
|
||||||
| Discord | Yes | Yes |
|
| Discord | Yes (Maximum of 10 per notification) | Yes (Maximum of 10 per notification) |
|
||||||
| Email | Yes | Yes |
|
| Email | Yes (Embedded in the email) | Yes |
|
||||||
| Google Hangouts Chat | No | Yes |
|
| Google Hangouts Chat | No | Yes |
|
||||||
| Kafka | No | No |
|
| Kafka | No | No |
|
||||||
| Line | No | No |
|
| Line | No | No |
|
||||||
| Microsoft Teams | No | Yes |
|
| Microsoft Teams | No | Yes |
|
||||||
| Opsgenie | No | Yes |
|
| Opsgenie | No | Yes |
|
||||||
| Pagerduty | No | Yes |
|
| Pagerduty | No | Yes |
|
||||||
| Prometheus Alertmanager | No | No |
|
| Prometheus Alertmanager | No | No |
|
||||||
| Pushover | Yes | No |
|
| Pushover | Yes (Maximum of 1 per notification) | No |
|
||||||
| Sensu Go | No | No |
|
| Sensu Go | No | No |
|
||||||
| Slack | No (will be available in 9.4) | Yes |
|
| Slack | Yes (when using Bot tokens, maximum of 5 per notification) | Yes (when using webhooks, maximum of 1 per notification) |
|
||||||
| Telegram | Yes | No |
|
| Telegram | Yes | No |
|
||||||
| Threema | No | No |
|
| Threema | No | No |
|
||||||
| VictorOps | No | No |
|
| VictorOps | No | No |
|
||||||
| Webhook | No | Yes |
|
| Webhook | No | Yes |
|
||||||
| Cisco Webex Teams | No | Yes |
|
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
- This feature is not supported for Mimir or Loki rules, or when Grafana sends alert notifications to an external Alertmanager.
|
- This feature is not supported in Mimir or Loki, or when Grafana is configured to send alerts to other Alertmanagers such as the Prometheus Alertmanager.
|
||||||
- When multiple alerts are sent in a single notification a screenshot might be included for each alert. The order the images are shown in random.
|
- A number of contact points support at most one image per notification. In this case, just the first image is either uploaded to the receiving service or referenced from cloud storage per notification.
|
||||||
- Some contact points support at most one image per notification. In this case, the first image associated with an alert will be attached.
|
- When multiple alerts are sent in a single notification a screenshot might be included for each alert. The order the images are shown is random.
|
||||||
- We don't recommend using cloud storage if the cloud storage service is behind a firewall, gateway service, or VPN, as screenshots might not be shown in notifications.
|
- If uploading screenshots to a cloud storage service such as Amazon S3, Azure Blob Storage or Google Cloud Storage; and accessing screenshots in the bucket requires authentication, logging into a VPN or corporate network; image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN.
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
@@ -113,9 +115,7 @@ If Grafana has been set up to send images in notifications, however notification
|
|||||||
3. If the alert is not associated with a dashboard there will be logs for `Cannot take screenshot for alert rule as it is not associated with a dashboard`.
|
3. If the alert is not associated with a dashboard there will be logs for `Cannot take screenshot for alert rule as it is not associated with a dashboard`.
|
||||||
4. If the alert is associated with a dashboard, but no panel in the dashboard, there will be logs for `Cannot take screenshot for alert rule as it is not associated with a panel`.
|
4. If the alert is associated with a dashboard, but no panel in the dashboard, there will be logs for `Cannot take screenshot for alert rule as it is not associated with a panel`.
|
||||||
5. If images cannot be taken because of mis-configuration or an issue with image rendering there will be logs for `Failed to take an image` including the Dashboard UID, Panel ID, and the error message.
|
5. If images cannot be taken because of mis-configuration or an issue with image rendering there will be logs for `Failed to take an image` including the Dashboard UID, Panel ID, and the error message.
|
||||||
6. Check that the contact point supports images in notifications, and the present configuration, as per the table.
|
6. Check that the contact point supports images in notifications and whether it supports uploading images to the receiving service or referencing images that have been uploaded to a cloud storage service.
|
||||||
7. If the image was uploaded to cloud storage make sure it is public.
|
|
||||||
8. If images are made available via Grafana's built in web server make sure it is accessible via the Internet.
|
|
||||||
|
|
||||||
## Metrics
|
## Metrics
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ A mute timing is a recurring interval of time when no new notifications for a po
|
|||||||
|
|
||||||
Similar to silences, mute timings do not prevent alert rules from being evaluated, nor do they stop alert instances from being shown in the user interface. They only prevent notifications from being created.
|
Similar to silences, mute timings do not prevent alert rules from being evaluated, nor do they stop alert instances from being shown in the user interface. They only prevent notifications from being created.
|
||||||
|
|
||||||
You can configure Grafana managed mute timings as well as mute timings for an [external Alertmanager data source]({{< relref "../../datasources/alertmanager/" >}}). For more information, refer to [Alertmanager documentation]((https://grafana.com/docs/grafana/next/alerting/manage-notifications/alertmanager/).
|
You can configure Grafana managed mute timings as well as mute timings for an [external Alertmanager data source]({{< relref "/docs/grafana/latest/datasources/alertmanager" >}}). For more information, refer to [Alertmanager documentation]({{< relref "/docs/grafana/latest/alerting/manage-notifications/alertmanager" >}}).
|
||||||
|
|
||||||
## Mute timings vs silences
|
## Mute timings vs silences
|
||||||
|
|
||||||
|
|||||||
@@ -24,15 +24,15 @@ In the Contact points tab, you can see a list of your notification templates.
|
|||||||
|
|
||||||
To create a template, complete the following steps.
|
To create a template, complete the following steps.
|
||||||
|
|
||||||
1. Click New template.
|
1. Click **Add template**.
|
||||||
|
|
||||||
2. Choose a name for the notification template.
|
2. Choose a name for the notification template.
|
||||||
|
|
||||||
3. Write the content of the template in the content field.
|
3. Write the content of the template in the content field.
|
||||||
|
|
||||||
{{< figure max-width="940px" src="/static/img/docs/alerting/unified/new-notification-template-email-subject-9-4.png" caption="New notification template email.subject" >}}
|
{{< figure max-width="940px" src="/static/img/docs/alerting/unified/new-notification-template-email-subject-9-4.png" caption="New notification template email.subject" >}}
|
||||||
|
|
||||||
5. Click Save.
|
4. Click Save.
|
||||||
|
|
||||||
`{{ define "email.subject" }}` and `{{ end }}` is automatically added to the start and end of the content:
|
`{{ define "email.subject" }}` and `{{ end }}` is automatically added to the start and end of the content:
|
||||||
|
|
||||||
@@ -40,15 +40,15 @@ To create a template, complete the following steps.
|
|||||||
|
|
||||||
To create a notification template that contains more than one template:
|
To create a notification template that contains more than one template:
|
||||||
|
|
||||||
1. Click New Template.
|
1. Click **Add Template**.
|
||||||
|
|
||||||
2. Enter a name for the notification template.
|
2. Enter a name for the notification template.
|
||||||
|
|
||||||
3. Write each template in the Content field, including `{{ define "name-of-template" }}` and `{{ end }}` at the start and end of each template.
|
3. Write each template in the Content field, including `{{ define "name-of-template" }}` and `{{ end }}` at the start and end of each template.
|
||||||
|
|
||||||
{{< figure max-width="940px" src="/static/img/docs/alerting/unified/new-notification-template-email-9-4.png" caption="New notification template" >}}
|
{{< figure max-width="940px" src="/static/img/docs/alerting/unified/new-notification-template-email-9-4.png" caption="New notification template" >}}
|
||||||
|
|
||||||
5. Click Save.
|
4. Click Save.
|
||||||
|
|
||||||
## Template the subject of an email
|
## Template the subject of an email
|
||||||
|
|
||||||
@@ -60,17 +60,17 @@ Template the subject of an email to contain the number of firing and resolved al
|
|||||||
|
|
||||||
1. Create a template called `email.subject` with the following content:
|
1. Create a template called `email.subject` with the following content:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ define "email.subject" }}
|
{{ define "email.subject" }}
|
||||||
{{ len .Alerts.Firing }} firing alert(s), {{ len .Alerts.Resolved }} resolved alert(s)
|
{{ len .Alerts.Firing }} firing alert(s), {{ len .Alerts.Resolved }} resolved alert(s)
|
||||||
{{ end }}
|
{{ end }}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Execute the template from the subject field in your contact point integration:
|
2. Execute the template from the subject field in your contact point integration:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ template "email.subject" . }}
|
{{ template "email.subject" . }}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Template the message of an email
|
## Template the message of an email
|
||||||
|
|
||||||
@@ -93,37 +93,37 @@ Resolved alerts:
|
|||||||
|
|
||||||
The `email.message_alert` template is used to print the labels and values for each firing and resolved alert while the `email.message` template contains the structure of the email.
|
The `email.message_alert` template is used to print the labels and values for each firing and resolved alert while the `email.message` template contains the structure of the email.
|
||||||
|
|
||||||
```
|
```
|
||||||
{{- define "email.message_alert" -}}
|
{{- define "email.message_alert" -}}
|
||||||
{{- range .Labels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }} has value(s)
|
{{- range .Labels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }} has value(s)
|
||||||
{{- range $k, $v := .Values }} {{ $k }}={{ $v }}{{ end }}
|
{{- range $k, $v := .Values }} {{ $k }}={{ $v }}{{ end }}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{ define "email.message" }}
|
{{ define "email.message" }}
|
||||||
There are {{ len .Alerts.Firing }} firing alert(s), and {{ len .Alerts.Resolved }} resolved alert(s)
|
There are {{ len .Alerts.Firing }} firing alert(s), and {{ len .Alerts.Resolved }} resolved alert(s)
|
||||||
|
|
||||||
{{ if .Alerts.Firing -}}
|
{{ if .Alerts.Firing -}}
|
||||||
Firing alerts:
|
Firing alerts:
|
||||||
{{- range .Alerts.Firing }}
|
{{- range .Alerts.Firing }}
|
||||||
- {{ template "email.message_alert" . }}
|
- {{ template "email.message_alert" . }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
{{ if .Alerts.Resolved -}}
|
{{ if .Alerts.Resolved -}}
|
||||||
Resolved alerts:
|
Resolved alerts:
|
||||||
{{- range .Alerts.Resolved }}
|
{{- range .Alerts.Resolved }}
|
||||||
- {{ template "email.message_alert" . }}
|
- {{ template "email.message_alert" . }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Execute the template from the message field in your contact point integration:
|
2. Execute the template from the message field in your contact point integration:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ template "email.message" . }}
|
{{ template "email.message" . }}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Template the title of a Slack message
|
## Template the title of a Slack message
|
||||||
|
|
||||||
@@ -135,17 +135,17 @@ Template the title of a Slack message to contain the number of firing and resolv
|
|||||||
|
|
||||||
1. Create a template called `slack.title` with the following content:
|
1. Create a template called `slack.title` with the following content:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ define "slack.title" }}
|
{{ define "slack.title" }}
|
||||||
{{ len .Alerts.Firing }} firing alert(s), {{ len .Alerts.Resolved }} resolved alert(s)
|
{{ len .Alerts.Firing }} firing alert(s), {{ len .Alerts.Resolved }} resolved alert(s)
|
||||||
{{ end }}
|
{{ end }}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Execute the template from the title field in your contact point integration:
|
2. Execute the template from the title field in your contact point integration:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ template "slack.title" . }}
|
{{ template "slack.title" . }}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Template the content of a Slack message
|
## Template the content of a Slack message
|
||||||
|
|
||||||
@@ -179,48 +179,48 @@ Go to dashboard: https://example.com/d/dlhdLqF4z?orgId=1
|
|||||||
|
|
||||||
The `slack.print_alert` template is used to print the labels, annotations, SilenceURL and DashboardURL while the `slack.message` template contains the structure of the notification.
|
The `slack.print_alert` template is used to print the labels, annotations, SilenceURL and DashboardURL while the `slack.message` template contains the structure of the notification.
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ define "slack.print_alert" -}}
|
{{ define "slack.print_alert" -}}
|
||||||
[{{.Status}}] {{ .Labels.alertname }}
|
[{{.Status}}] {{ .Labels.alertname }}
|
||||||
Labels:
|
Labels:
|
||||||
{{ range .Labels.SortedPairs -}}
|
{{ range .Labels.SortedPairs -}}
|
||||||
- {{ .Name }}: {{ .Value }}
|
- {{ .Name }}: {{ .Value }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ if .Annotations -}}
|
{{ if .Annotations -}}
|
||||||
Annotations:
|
Annotations:
|
||||||
{{ range .Annotations.SortedPairs -}}
|
{{ range .Annotations.SortedPairs -}}
|
||||||
- {{ .Name }}: {{ .Value }}
|
- {{ .Name }}: {{ .Value }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ if .SilenceURL -}}
|
{{ if .SilenceURL -}}
|
||||||
Silence: {{ .SilenceURL }}
|
Silence: {{ .SilenceURL }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ if .DashboardURL -}}
|
{{ if .DashboardURL -}}
|
||||||
Go to dashboard: {{ .DashboardURL }}
|
Go to dashboard: {{ .DashboardURL }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
{{ define "slack.message" -}}
|
{{ define "slack.message" -}}
|
||||||
{{ if .Alerts.Firing -}}
|
{{ if .Alerts.Firing -}}
|
||||||
{{ len .Alerts.Firing }} firing alert(s):
|
{{ len .Alerts.Firing }} firing alert(s):
|
||||||
{{ range .Alerts.Firing }}
|
{{ range .Alerts.Firing }}
|
||||||
{{ template "slack.print_alert" . }}
|
{{ template "slack.print_alert" . }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ if .Alerts.Resolved -}}
|
{{ if .Alerts.Resolved -}}
|
||||||
{{ len .Alerts.Resolved }} resolved alert(s):
|
{{ len .Alerts.Resolved }} resolved alert(s):
|
||||||
{{ range .Alerts.Resolved }}
|
{{ range .Alerts.Resolved }}
|
||||||
{{ template "slack.print_alert" .}}
|
{{ template "slack.print_alert" .}}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Execute the template from the text body field in your contact point integration:
|
2. Execute the template from the text body field in your contact point integration:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ template "slack.message" . }}
|
{{ template "slack.message" . }}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Template both email and Slack with shared templates
|
## Template both email and Slack with shared templates
|
||||||
|
|
||||||
@@ -234,20 +234,20 @@ For example, if you want to send an email with this subject and Slack message wi
|
|||||||
|
|
||||||
1. Create a template called `common.subject_title` with the following content:
|
1. Create a template called `common.subject_title` with the following content:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ define "common.subject_title" }}
|
{{ define "common.subject_title" }}
|
||||||
{{ len .Alerts.Firing }} firing alert(s), {{ len .Alerts.Resolved }} resolved alert(s)
|
{{ len .Alerts.Firing }} firing alert(s), {{ len .Alerts.Resolved }} resolved alert(s)
|
||||||
{{ end }}
|
{{ end }}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. For email, execute the template from the subject field in your email contact point integration:
|
2. For email, execute the template from the subject field in your email contact point integration:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ template "common.subject_title" . }}
|
{{ template "common.subject_title" . }}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. For Slack, execute the template from the title field in your Slack contact point integration:
|
3. For Slack, execute the template from the title field in your Slack contact point integration:
|
||||||
|
|
||||||
```
|
```
|
||||||
{{ template "common.subject_title" . }}
|
{{ template "common.subject_title" . }}
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ In the Contact points tab, you can see a list of your contact points.
|
|||||||
|
|
||||||
2. Execute a template from one or more fields such as Message and Subject:
|
2. Execute a template from one or more fields such as Message and Subject:
|
||||||
|
|
||||||
{{< figure max-width="940px" src="/static/img/docs/alerting/unified/use-notification-template-9-4.png" caption="Use notification template" >}}
|
{{< figure max-width="940px" src="/static/img/docs/alerting/unified/use-notification-template-9-4.png" caption="Use notification template" >}}
|
||||||
|
|
||||||
For more information on how to write and execute templates, refer to [Using Go's templating language]({{< relref "./using-go-templating-language" >}}) and [Create notification templates]({{< relref "./create-notification-templates" >}}).
|
For more information on how to write and execute templates, refer to [Using Go's templating language]({{< relref "./using-go-templating-language" >}}) and [Create notification templates]({{< relref "./create-notification-templates" >}}).
|
||||||
|
|
||||||
4. Click Save template.
|
3. Click Save template.
|
||||||
|
|||||||
@@ -71,6 +71,16 @@ The name of the annotation is {{ .Name }}, and the value is {{ .Value }}
|
|||||||
{{ end }}
|
{{ end }}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## The index function
|
||||||
|
|
||||||
|
To print a specific annotation or label use the `index` function.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ range .Alerts }}
|
||||||
|
The name of the alert is {{ index .Labels "alertname" }}
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
## If statements
|
## If statements
|
||||||
|
|
||||||
You can use if statements in templates. For example, to print `There are no alerts` if there are no alerts in `.Alerts` you would write the following:
|
You can use if statements in templates. For example, to print `There are no alerts` if there are no alerts in `.Alerts` you would write the following:
|
||||||
|
|||||||
147
docs/sources/alerting/meta-monitoring/_index.md
Normal file
147
docs/sources/alerting/meta-monitoring/_index.md
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- meta-monitoring/
|
||||||
|
description: Meta monitoring
|
||||||
|
keywords:
|
||||||
|
- grafana
|
||||||
|
- alerting
|
||||||
|
- meta-monitoring
|
||||||
|
title: Meta monitoring
|
||||||
|
weight: 500
|
||||||
|
---
|
||||||
|
|
||||||
|
# Meta monitoring
|
||||||
|
|
||||||
|
Meta monitoring is the process of monitoring your monitoring, and alerting when your monitoring is not working as it should. Whether you use Grafana Managed Alerts or Mimir, meta monitoring is possible both on-premise and in Grafana Cloud.
|
||||||
|
|
||||||
|
## Grafana Managed Alerts
|
||||||
|
|
||||||
|
Meta monitoring of Grafana Managed Alerts requires having a Prometheus server, or other metrics database, collecting and storing metrics exported by Grafana. For example, if using Prometheus you should add a `scrape_config` to Prometheus to scrape metrics from your Grafana server.
|
||||||
|
|
||||||
|
Here is an example of how this might look:
|
||||||
|
|
||||||
|
```
|
||||||
|
- job_name: grafana
|
||||||
|
honor_timestamps: true
|
||||||
|
scrape_interval: 15s
|
||||||
|
scrape_timeout: 10s
|
||||||
|
metrics_path: /metrics
|
||||||
|
scheme: http
|
||||||
|
follow_redirects: true
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- grafana:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
The Grafana ruler, which is responsible for evaluating alert rules, and the Grafana Alertmanager, which is responsible for sending notifications of firing and resolved alerts, provide a number of metrics that let you observe them.
|
||||||
|
|
||||||
|
#### grafana_alerting_alerts
|
||||||
|
|
||||||
|
This metric is a counter that shows you the number of `normal`, `pending`, `alerting`, `nodata` and `error` alerts. For example, you might want to create an alert that fires when `grafana_alerting_alerts{state="error"}` is greater than 0.
|
||||||
|
|
||||||
|
#### grafana_alerting_schedule_alert_rules
|
||||||
|
|
||||||
|
This metric is a gauge that shows you the number of alert rules scheduled. An alert rule is scheduled unless it is paused, and the value of this metric should match the total number of non-paused alert rules in Grafana.
|
||||||
|
|
||||||
|
#### grafana_alerting_schedule_periodic_duration_seconds_bucket
|
||||||
|
|
||||||
|
This metric is a histogram that shows you the time it takes to process an individual tick in the scheduler that evaluates alert rules. If the scheduler takes longer than 10 seconds to process a tick then pending evaluations will start to accumulate such that alert rules might later than expected.
|
||||||
|
|
||||||
|
#### grafana_alerting_schedule_query_alert_rules_duration_seconds_bucket
|
||||||
|
|
||||||
|
This metric is a histogram that shows you how long it takes the scheduler to fetch the latest rules from the database. If this metric is elevated then so will `schedule_periodic_duration_seconds`.
|
||||||
|
|
||||||
|
#### grafana_alerting_scheduler_behind_seconds
|
||||||
|
|
||||||
|
This metric is a gauge that shows you the number of seconds that the scheduler is behind where it should be. This number will increase if `schedule_periodic_duration_seconds` is longer than 10 seconds, and decrease when it is less than 10 seconds. The smallest possible value of this metric is 0.
|
||||||
|
|
||||||
|
#### grafana_alerting_notification_latency_seconds_bucket
|
||||||
|
|
||||||
|
This metric is a histogram that shows you the number of seconds taken to send notifications for firing and resolved alerts. This metric will let you observe slow or over-utilized integrations, such as an SMTP server that is being given emails faster than it can send them.
|
||||||
|
|
||||||
|
> These metrics are not available at present in Grafana Cloud.
|
||||||
|
|
||||||
|
## Grafana Mimir
|
||||||
|
|
||||||
|
Meta monitoring in Grafana Mimir requires having a Prometheus/Mimir server, or other metrics database, collecting and storing metrics exported by the Mimir ruler.
|
||||||
|
|
||||||
|
#### cortex_prometheus_rule_evaluation_failures_total
|
||||||
|
|
||||||
|
This metric is a counter that shows you the total number of rule evaluation failures.
|
||||||
|
|
||||||
|
## Alertmanager
|
||||||
|
|
||||||
|
Meta monitoring in Alertmanager also requires having a Prometheus/Mimir server, or other metrics database, collecting and storing metrics exported by Alertmanager. For example, if using Prometheus you should add a `scrape_config` to Prometheus to scrape metrics from your Alertmanager.
|
||||||
|
|
||||||
|
Here is an example of how this might look:
|
||||||
|
|
||||||
|
```
|
||||||
|
- job_name: alertmanager
|
||||||
|
honor_timestamps: true
|
||||||
|
scrape_interval: 15s
|
||||||
|
scrape_timeout: 10s
|
||||||
|
metrics_path: /metrics
|
||||||
|
scheme: http
|
||||||
|
follow_redirects: true
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- alertmanager:9093
|
||||||
|
```
|
||||||
|
|
||||||
|
#### alertmanager_alerts
|
||||||
|
|
||||||
|
This metric is a counter that shows you the number of active, suppressed and unprocessed alerts in Alertmanager. Suppressed alerts are silenced alerts, and unprocessed alerts are alerts that have been sent to the Alertmanager but have not been processed.
|
||||||
|
|
||||||
|
#### alertmanager_alerts_invalid_total
|
||||||
|
|
||||||
|
This metric is a counter that shows you the number of invalid alerts that were sent to Alertmanager. This counter should not exceed 0, and so in most cases you will want to create an alert that fires if whenever this metric increases.
|
||||||
|
|
||||||
|
#### alertmanager_notifications_total
|
||||||
|
|
||||||
|
This metric is a counter that shows you how many notifications have been sent by Alertmanager. The metric uses a label "integration" to show the number of notifications sent by integration, such as email.
|
||||||
|
|
||||||
|
#### alertmanager_notifications_failed_total
|
||||||
|
|
||||||
|
This metric is a counter that shows you how many notifications have failed in total. This metric also uses a label "integration" to show the number of failed notifications by integration, such as failed emails. In most cases you will want to use the `rate` function to understand how often notifications are failing to be sent.
|
||||||
|
|
||||||
|
#### alertmanager_notification_latency_seconds_bucket
|
||||||
|
|
||||||
|
This metric is a histogram that shows you the amount of time it takes Alertmanager to send notifications and for those notifications to be accepted by the receiving service. This metric uses a label "integration" to show the amount of time by integration. For example, you can use this metric to show the 95th percentile latency of sending emails.
|
||||||
|
|
||||||
|
> In Grafana Cloud some of these metrics are available via the Prometheus usage datasource that is provisioned for all Grafana Cloud customers.
|
||||||
|
|
||||||
|
## Alertmanager in high availability mode
|
||||||
|
|
||||||
|
If using Alertmanager in high availability mode there are a number of additional metrics that you might want to create alerts for.
|
||||||
|
|
||||||
|
#### alertmanager_cluster_members
|
||||||
|
|
||||||
|
This metric is a gauge that shows you the current number of members in the cluster. The value of this gauge should be the same across all Alertmanagers. If different Alertmanagers are showing different numbers of members then this is indicative of an issue with your Alertmanager cluster. You should look at the metrics and logs from your Alertmanagers to better understand what might be going wrong.
|
||||||
|
|
||||||
|
#### alertmanager_cluster_failed_peers
|
||||||
|
|
||||||
|
This metric is a gauge that shows you the current number of failed peers.
|
||||||
|
|
||||||
|
#### alertmanager_cluster_health_score
|
||||||
|
|
||||||
|
This metric is a gauge showing the health score of the Alertmanager. Lower values are better, and zero means the Alertmanager is healthy.
|
||||||
|
|
||||||
|
#### alertmanager_cluster_peer_info
|
||||||
|
|
||||||
|
This metric is a gauge. It has a constant value `1`, and contains a label called "peer" containing the Peer ID of each known peer.
|
||||||
|
|
||||||
|
#### alertmanager_cluster_reconnections_failed_total
|
||||||
|
|
||||||
|
This metric is a counter that shows you the number of failed peer connection attempts. In most cases you will want to use the `rate` function to understand how often reconnections fail as this may be indicative of an issue or instability in your network.
|
||||||
|
|
||||||
|
> These metrics are not available in Grafana Cloud as it uses a different high availability strategy than on-premise Alertmanagers.
|
||||||
|
|
||||||
|
<!---
|
||||||
|
#### cortex_prometheus_rule_group_last_evaluation_timestamp_seconds
|
||||||
|
|
||||||
|
#### cortex_prometheus_rule_group_rules
|
||||||
|
|
||||||
|
This metric is a counter that shows
|
||||||
|
|
||||||
|
> In Grafana Cloud these metrics are available via the Prometheus usage datasource that is provisioned for all Grafana Cloud customers.
|
||||||
|
-->
|
||||||
@@ -20,16 +20,21 @@ longer supported. We refer to these as [Differences]({{< relref "#differences" >
|
|||||||
|
|
||||||
2. Read and write access to legacy dashboard alerts and Grafana alerts are governed by the permissions of the folders storing them. During migration, legacy dashboard alert permissions are matched to the new rules permissions as follows:
|
2. Read and write access to legacy dashboard alerts and Grafana alerts are governed by the permissions of the folders storing them. During migration, legacy dashboard alert permissions are matched to the new rules permissions as follows:
|
||||||
|
|
||||||
- If alert's dashboard has permissions, it will create a folder named like `Migrated {"dashboardUid": "UID", "panelId": 1, "alertId": 1}` to match permissions of the dashboard (including the inherited permissions from the folder).
|
- If there are dashboard permissions, a folder named `Migrated {"dashboardUid": "UID", "panelId": 1, "alertId": 1}` is created to match the permissions of the dashboard (including the inherited permissions from the folder).
|
||||||
- If there are no dashboard permissions and the dashboard is under a folder, then the rule is linked to this folder and inherits its permissions.
|
- If there are no dashboard permissions and the dashboard is in a folder, then the rule is linked to this folder and inherits its permissions.
|
||||||
- If there are no dashboard permissions and the dashboard is under the General folder, then the rule is linked to the `General Alerting` folder, and the rule inherits the default permissions.
|
- If there are no dashboard permissions and the dashboard is in the General folder, then the rule is linked to the `General Alerting` folder and the rule inherits the default permissions.
|
||||||
|
|
||||||
3. Since there is no `Keep Last State` option for [`No Data`]({{< relref "../alerting-rules/create-grafana-managed-rule/#no-data--error-handling" >}}) in Grafana Alerting, this option becomes `NoData` during the legacy rules migration. Option "Keep Last State" for [`Error handling`]({{< relref "../alerting-rules/create-grafana-managed-rule/#no-data--error-handling" >}}) is migrated to a new option `Error`. To match the behavior of the `Keep Last State`, in both cases, during the migration Grafana automatically creates a silence for each alert rule with a duration of 1 year.
|
3. `NoData` and `Error` settings are migrated as is to the corresponding settings in Grafana Alerting, except in two situations:
|
||||||
|
|
||||||
|
3.1. As there is no `Keep Last State` option for `No Data` in Grafana Alerting, this option becomes `NoData`. The `Keep Last State` option for `Error` is migrated to a new option `Error`. To match the behavior of the `Keep Last State`, in both cases, during the migration Grafana automatically creates a silence for each alert rule with a duration of 1 year.
|
||||||
|
|
||||||
|
3.2. Due to lack of validation, legacy alert rules imported via JSON or provisioned along with dashboards can contain arbitrary values for `NoData` and [`Error`](/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md#configure-no-data-and-error-handling). In this situation, Grafana will use the default setting: `NoData` for No data, and `Error` for Error.
|
||||||
|
|
||||||
4. Notification channels are migrated to an Alertmanager configuration with the appropriate routes and receivers. Default notification channels are added as contact points to the default route. Notification channels not associated with any Dashboard alert go to the `autogen-unlinked-channel-recv` route.
|
4. Notification channels are migrated to an Alertmanager configuration with the appropriate routes and receivers. Default notification channels are added as contact points to the default route. Notification channels not associated with any Dashboard alert go to the `autogen-unlinked-channel-recv` route.
|
||||||
|
|
||||||
5. Unlike legacy dashboard alerts where images in notifications are enabled per contact point, images in notifications for Grafana Alerting must be enabled in the Grafana configuration, either in the configuration file or environment variables, and are enabled for either all or no contact points. Refer to [images in notifications](https://grafana.com/docs/grafana/latest/alerting/manage-notifications/images-in-notifications/).
|
5. Unlike legacy dashboard alerts where images in notifications are enabled per contact point, images in notifications for Grafana Alerting must be enabled in the Grafana configuration, either in the configuration file or environment variables, and are enabled for either all or no contact points. Refer to [images in notifications]({{< relref "../manage-notifications/images-in-notifications" >}}).
|
||||||
6. Grafana Alerting does not support pausing the evaluation of alert rules. After migration, all paused alert rules will become active, which may cause unexpected notifications to be sent.
|
|
||||||
|
6. The JSON format for webhook notifications has changed in Grafana Alerting and uses the format from [Prometheus Alertmanager](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config).
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
|
|||||||
@@ -26,12 +26,11 @@ External alertmanagers should now be configured as data sources using Grafana Co
|
|||||||
To add an external Alertmanager, complete the following steps.
|
To add an external Alertmanager, complete the following steps.
|
||||||
|
|
||||||
1. Click Configuration and then Data sources.
|
1. Click Configuration and then Data sources.
|
||||||
2. Search for Alertmanager.
|
1. Search for Alertmanager.
|
||||||
3. Choose your Implementation and fill out the fields on the page, as required.
|
1. Choose your Implementation and fill out the fields on the page, as required.
|
||||||
|
|
||||||
If you are provisioning your data source, set the flag `handleGrafanaManagedAlerts` in the `jsonData` field to `true` to send Grafana-managed alerts to this Alertmanager.
|
If you are provisioning your data source, set the flag `handleGrafanaManagedAlerts` in the `jsonData` field to `true` to send Grafana-managed alerts to this Alertmanager.
|
||||||
|
|
||||||
**Note:**
|
**Note:**: Prometheus, Grafana Mimir, and Cortex implementations of Alertmanager are supported. For Prometheus, contact points and notification policies are read-only in the Grafana Alerting UI.
|
||||||
Prometheus, Grafana Mimir, and Cortex implementations of Alertmanager are supported. For Prometheus, contact points and notification policies are read-only in the Grafana Alerting UI.
|
|
||||||
|
|
||||||
4. Click Save & test.
|
1. Click Save & test.
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ spec:
|
|||||||
app: grafana
|
app: grafana
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Make sure your grafana deployment has the label matching the selector, e.g. `app:grafana`.
|
4. Make sure your grafana deployment has the label matching the selector, e.g. `app:grafana`:
|
||||||
|
|
||||||
5. Add in the grafana.ini:
|
5. Add in the grafana.ini:
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ groups:
|
|||||||
# evaluation - should be obtained trough the API
|
# evaluation - should be obtained trough the API
|
||||||
data:
|
data:
|
||||||
- refId: A
|
- refId: A
|
||||||
datasourceUid: '-100'
|
datasourceUid: '__expr__'
|
||||||
model:
|
model:
|
||||||
conditions:
|
conditions:
|
||||||
- evaluator:
|
- evaluator:
|
||||||
@@ -86,7 +86,7 @@ groups:
|
|||||||
type: query
|
type: query
|
||||||
datasource:
|
datasource:
|
||||||
type: __expr__
|
type: __expr__
|
||||||
uid: '-100'
|
uid: '__expr__'
|
||||||
expression: 1==0
|
expression: 1==0
|
||||||
intervalMs: 1000
|
intervalMs: 1000
|
||||||
maxDataPoints: 43200
|
maxDataPoints: 43200
|
||||||
@@ -313,7 +313,7 @@ settings:
|
|||||||
```yaml
|
```yaml
|
||||||
type: pagerduty
|
type: pagerduty
|
||||||
settings:
|
settings:
|
||||||
# <string, required>
|
# <string, required> the 32-character Events API key https://support.pagerduty.com/docs/api-access-keys#events-api-keys
|
||||||
integrationKey: XXX
|
integrationKey: XXX
|
||||||
# <string> options: critical, error, warning, info
|
# <string> options: critical, error, warning, info
|
||||||
severity: critical
|
severity: critical
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ resource "grafana_rule_group" "my_rule_group" {
|
|||||||
|
|
||||||
// The query was configured to obtain data from the last 60 seconds. Let's alert on the average value of that series using a Reduce stage.
|
// The query was configured to obtain data from the last 60 seconds. Let's alert on the average value of that series using a Reduce stage.
|
||||||
data {
|
data {
|
||||||
datasource_uid = "-100"
|
datasource_uid = "__expr__"
|
||||||
// You can also create a rule in the UI, then GET that rule to obtain the JSON.
|
// You can also create a rule in the UI, then GET that rule to obtain the JSON.
|
||||||
// This can be helpful when using more complex reduce expressions.
|
// This can be helpful when using more complex reduce expressions.
|
||||||
model = <<EOT
|
model = <<EOT
|
||||||
@@ -298,7 +298,7 @@ EOT
|
|||||||
// Now, let's use a math expression as our threshold.
|
// Now, let's use a math expression as our threshold.
|
||||||
// We want to alert when the value of stage "B" above exceeds 70.
|
// We want to alert when the value of stage "B" above exceeds 70.
|
||||||
data {
|
data {
|
||||||
datasource_uid = "-100"
|
datasource_uid = "__expr__"
|
||||||
ref_id = "C"
|
ref_id = "C"
|
||||||
relative_time_range {
|
relative_time_range {
|
||||||
from = 0
|
from = 0
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
title: Copyright notice
|
|
||||||
---
|
|
||||||
|
|
||||||
# Copyright notice
|
|
||||||
|
|
||||||
Copyright © 2021 Raintank, Inc. dba Grafana Labs. All Rights Reserved.
|
|
||||||
@@ -1,6 +1,12 @@
|
|||||||
---
|
---
|
||||||
aliases:
|
aliases:
|
||||||
- features/dashboard/dashboards/
|
- features/dashboard/dashboards/
|
||||||
|
cascade:
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
title: Dashboards
|
title: Dashboards
|
||||||
weight: 70
|
weight: 70
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -14,85 +14,124 @@ weight: 600
|
|||||||
|
|
||||||
# Annotate visualizations
|
# Annotate visualizations
|
||||||
|
|
||||||
Annotations provide a way to mark points on the graph with rich events. When you hover over an annotation
|
Annotations provide a way to mark points on a visualization with rich events. They are visualized as vertical lines and icons on all graph panels. When you hover over an annotation, you can get event description and event tags. The text field can include links to other systems with more detail.
|
||||||
you can get event description and event tags. The text field can include links to other systems with more detail.
|
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/v46/annotations.png" max-width="800px" >}}
|
{{< figure src="/static/img/docs/v46/annotations.png" max-width="800px" >}}
|
||||||
|
|
||||||
## Native annotations
|
You can annotate visualizations in three ways:
|
||||||
|
|
||||||
Grafana comes with a native annotation store and the ability to add annotation events directly from the graph panel or via the [HTTP API]({{< relref "../../../developers/http_api/annotations/" >}}).
|
- Directly in the panel, using the [built-in annotations query](#built-in-query)
|
||||||
|
- Using the HTTP API
|
||||||
|
- Configuring annotation queries in the dashboard settings
|
||||||
|
|
||||||
### Add annotation
|
In the first two cases, you're creating new annotations, while in the last you're querying existing annotations from data sources. The built-in annotation query also supports this.
|
||||||
|
|
||||||
1. In the dashboard click on the Time series panel. A context menu will appear.
|
This page explains the first and third options; for information about using the HTTP API, refer to [Annotations API]({{< relref "../../../developers/http_api/annotations/" >}}).
|
||||||
1. In the context menu click on **Add annotation**.
|
|
||||||
|
Annotations are supported for the following visualization types:
|
||||||
|
|
||||||
|
- Time series
|
||||||
|
- State timeline
|
||||||
|
- Candlestick
|
||||||
|
|
||||||
|
## Create annotations in panels
|
||||||
|
|
||||||
|
Grafana comes with the ability to add annotation events directly from a panel using the [built-in annotation query](#built-in-query) that exists on all dashboards. Annotations that you create this way are stored in Grafana.
|
||||||
|
|
||||||
|
To add annotations directly in the panel, the built-in query must be enabled. Learn more in [Built-in query](#built-in-query)
|
||||||
|
|
||||||
|
### Add an annotation
|
||||||
|
|
||||||
|
To add an annotation, complete the following steps:
|
||||||
|
|
||||||
|
1. In the dashboard click the panel to which you're adding the annotation. A context menu will appear.
|
||||||
|
1. In the context menu, click **Add annotation**.
|
||||||

|

|
||||||
1. Add an annotation description and tags(optional).
|
1. Add an annotation description and tags (optional).
|
||||||

|
1. Click **Save**.
|
||||||
1. Click save.
|
|
||||||
|
|
||||||
Alternatively, to add an annotation, Ctrl/Cmd+Click on the Time series panel and the Add annotation popover will appear
|
Alternatively, to add an annotation, press Ctrl/Cmd and click the panel, and the **Add annotation** popover will appear.
|
||||||
|
|
||||||
### Add region annotation
|
### Add a region annotation
|
||||||
|
|
||||||
1. In the dashboard Ctrl/Cmd+click and drag on the Time series panel.
|
1. In the dashboard press Ctrl/Cmd and click and drag on the panel.
|
||||||

|

|
||||||
1. Add an annotation description and tags(optional).
|
1. Add an annotation description and tags (optional).
|
||||||
1. Click save.
|
1. Click **Save**.
|
||||||
|
|
||||||
### Edit annotation
|
### Edit an annotation
|
||||||
|
|
||||||
1. In the dashboard hover over an annotation indicator on the Time series panel.
|
1. In the dashboard, hover over an annotation indicator on the Time series panel.
|
||||||
<!---->
|
<!---->
|
||||||
1. Click on the pencil icon in the annotation tooltip.
|
1. Click on the pencil icon in the annotation tooltip.
|
||||||
1. Modify the description and/or tags.
|
1. Modify the description and/or tags.
|
||||||
1. Click save.
|
1. Click save.
|
||||||
|
|
||||||
### Delete annotation
|
### Delete an annotation
|
||||||
|
|
||||||
1. In the dashboard hover over an annotation indicator on the Time series panel.
|
1. In the dashboard hover over an annotation indicator on a panel.
|
||||||
<!---->
|
<!---->
|
||||||
1. Click on the trash icon in the annotation tooltip.
|
1. Click on the trash icon in the annotation tooltip.
|
||||||
|
|
||||||
### Built-in query
|
## Fetch annotations through dashboard settings
|
||||||
|
|
||||||
After you added an annotation they will still be visible. This is due to the built in annotation query that exists on all dashboards. This annotation query will
|
In the dashboard settings, under **Annotations**, you can add new queries to fetch annotations using any data source, including the built-in data annotation data source. Annotation queries return events that can be visualized as event markers in graphs across the dashboard.
|
||||||
fetch all annotation events that originate from the current dashboard and show them on the panel where they were created. This includes alert state history annotations. You can
|
|
||||||
stop annotations from being fetched and drawn by opening the **Annotations** settings (via Dashboard cogs menu) and modifying the query named `Annotations & Alerts (Built-in)`.
|
|
||||||
|
|
||||||
When you copy a dashboard using the **Save As** feature it will get a new dashboard id so annotations created on source dashboard will no longer be visible on the copy. You
|
### Add new annotation queries
|
||||||
can still show them if you add a new **Annotation Query** and filter by tags. But this only works if the annotations on the source dashboard had tags to filter by.
|
|
||||||
|
|
||||||
### Query by tag
|
To add a new annotation query to a dashboard, take the following steps:
|
||||||
|
|
||||||
You can create new queries to fetch annotations from the native annotation store via the `-- Grafana --` data source by setting _Filter by_ to `Tags`.
|
1. Click the dashboard settings (gear) icon in the dashboard header to open the settings menu.
|
||||||
|
1. Select **Annotations**.
|
||||||
|
1. Click **Add annotation query**.
|
||||||
|
|
||||||
|
If you've added a query before, the **+ New query** button is displayed.
|
||||||
|
|
||||||
|
1. Enter a name for the annotation query.
|
||||||
|
|
||||||
|
This name is given to the toggle (checkbox) that will allow you to enable/disable showing annotation events from this query.
|
||||||
|
|
||||||
|
1. Select the data source for the annotations.
|
||||||
|
1. If you don't want to use the annotation query right away, clear the **Enabled** checkbox.
|
||||||
|
1. If you don't want the annotation query toggle to be displayed in the dashboard, select the **Hidden** checkbox.
|
||||||
|
1. Select a color for the event markers.
|
||||||
|
1. Configure the query.
|
||||||
|
|
||||||
|
The annotation query options are different for each data source. For information about annotations in a specific data source, refer to the specific [data source]({{< relref "../../../datasources/" >}}) topic.
|
||||||
|
|
||||||
|
## Built-in query
|
||||||
|
|
||||||
|
After you add an annotation, they will still be visible. This is due to the built-in annotation query that exists on all dashboards. This annotation query will fetch all annotation events that originate from the current dashboard, which are stored in Grafana, and show them on the panel where they were created. This includes alert state history annotations.
|
||||||
|
|
||||||
|
To add annotations directly to the dashboard, this query must be enabled.
|
||||||
|
|
||||||
|
To confirm if the built-in query is enabled, take the following steps:
|
||||||
|
|
||||||
|
1. Click the dashboard settings (gear) icon in the dashboard header to open the dashboard settings menu.
|
||||||
|
1. Click **Annotations**.
|
||||||
|
1. Find the **Annotations & Alerts (Built-in)** query.
|
||||||
|
|
||||||
|
If it says **Disabled** before the name of the query, then you'll need to click the query name to open it and update the setting.
|
||||||
|
|
||||||
|
You can stop annotations from being fetched and drawn by taking the following steps:
|
||||||
|
|
||||||
|
1. Click the dashboard settings (gear) icon in the dashboard header to open the settings menu.
|
||||||
|
1. Click **Annotations**.
|
||||||
|
1. Find and click the **Annotations & Alerts (Built-in)** query to open it.
|
||||||
|
1. Click the **Enabled** toggle to turn it off.
|
||||||
|
|
||||||
|
When you copy a dashboard using the **Save As** feature it will get a new dashboard id, so annotations created on source dashboard will no longer be visible on the copy. You can still show them if you add a new **Annotation Query** and filter by tags. However, this only works if the annotations on the source dashboard had tags to filter by.
|
||||||
|
|
||||||
|
### Filter queries by tag
|
||||||
|
|
||||||
|
You can create new queries to fetch annotations from the built-in annotation query using the `-- Grafana --` data source by setting _Filter by_ to `Tags`.
|
||||||
|
|
||||||
Grafana v8.1 and later versions also support typeahead of existing tags, provide at least one tag.
|
Grafana v8.1 and later versions also support typeahead of existing tags, provide at least one tag.
|
||||||
|
|
||||||
For example, create an annotation query name `outages` and specify a tag `outage`. This query will show all annotations (from any dashboard or via API) with the `outage` tag. If multiple tags are defined in an annotation query, then Grafana will only show annotations matching all the tags. To modify the behavior, enable `Match any`, and Grafana will show annotations that contain any one of the tags you provided.
|
For example, create an annotation query name `outages` and specify a tag `outage`. This query will show all annotations (from any dashboard or via API) with the `outage` tag. If multiple tags are defined in an annotation query, then Grafana will only show annotations matching all the tags. To modify the behavior, enable `Match any`, and Grafana will show annotations that contain any one of the tags you provided.
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/annotations/annotations_typeahead_support-8-1-0.png" max-width="600px" >}}
|
{{< figure src="/media/docs/grafana/dashboards/screenshot-annotations-typeahead-support-10.0.png" max-width="600px" >}}
|
||||||
|
|
||||||
In Grafana v5.3+ it's possible to use template variables in the tag query. So if you have a dashboard showing stats for different services and a template variable that dictates which services to show, you can now use the same template variable in your annotation query to only show annotations for those services.
|
You can also use template variables in the tag query. This means if you have a dashboard showing stats for different services and a template variable that dictates which services to show, you can use the same template variable in your annotation query to only show annotations for those services.
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/annotations/annotation_tag_filter_variable-8-1-0.png" max-width="600px" >}}
|
{{< figure src="/media/docs/grafana/dashboards/screenshot-annotation-tag-filter-variable-10.0.png" max-width="600px" >}}
|
||||||
|
|
||||||
## Querying other data sources
|
|
||||||
|
|
||||||
Annotation events are fetched via annotation queries. To add a new annotation query to a dashboard
|
|
||||||
open the dashboard settings menu, then select `Annotations`. This will open the dashboard annotations
|
|
||||||
settings view. To create a new annotation query hit the `New` button.
|
|
||||||
|
|
||||||
<!---->
|
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/v50/annotation_new_query.png" max-width="600px" >}}
|
|
||||||
|
|
||||||
Specify a name for the annotation query. This name is given to the toggle (checkbox) that will allow
|
|
||||||
you to enable/disable showing annotation events from this query. For example you might have two
|
|
||||||
annotation queries named `Deploys` and `Outages`. The toggle will allow you to decide what annotations
|
|
||||||
to show.
|
|
||||||
|
|
||||||
### Annotation query details
|
|
||||||
|
|
||||||
The annotation query options are different for each data source. For information about annotations in a specific data source, refer to the specific [data source]({{< relref "../../../datasources/" >}}) topic.
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ The query parameter `var-adhoc=key|=|value` applies the ad hoc filter configured
|
|||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
See [https://play.grafana.org/d/000000002/influxdb-templated?orgId=1&var-datacenter=America&var-host=All&var-summarize=1m&var-adhoc=datacenter%7C%3D%7CAmerica] - this passes the ad hoc filter variable `adhoc` with the filter value `datacenter = America`.
|
[This example in Grafana Play](https://play.grafana.org/d/000000002/influxdb-templated?orgId=1&var-datacenter=America&var-host=All&var-summarize=1m&var-adhoc=datacenter%7C%3D%7CAmerica) passes the ad hoc filter variable `adhoc` with the filter value `datacenter = America`.
|
||||||
|
|
||||||
## Controlling time range using the URL
|
## Controlling time range using the URL
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,13 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee
|
|||||||
|
|
||||||
For more information about data sources, refer to [Data sources]({{< relref "../../../datasources/" >}}) for specific guidelines.
|
For more information about data sources, refer to [Data sources]({{< relref "../../../datasources/" >}}) for specific guidelines.
|
||||||
|
|
||||||
1. In the Visualization list, select a visualization type.
|
1. Click the Refresh dashboard icon to query the data source.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. In the visualization list, select a visualization type.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
Grafana displays a preview of your query results with the visualization applied.
|
Grafana displays a preview of your query results with the visualization applied.
|
||||||
|
|
||||||
@@ -48,9 +54,12 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee
|
|||||||
- [Configure thresholds]({{< relref "../../../panels-visualizations/configure-thresholds/" >}})
|
- [Configure thresholds]({{< relref "../../../panels-visualizations/configure-thresholds/" >}})
|
||||||
- [Configure standard options]({{< relref "../../../panels-visualizations/configure-standard-options/" >}})
|
- [Configure standard options]({{< relref "../../../panels-visualizations/configure-standard-options/" >}})
|
||||||
|
|
||||||
1. Add a note to describe the visualization (or describe your changes) and then click **Save** in the upper-right corner of the page.
|
1. When you've finished editing your panel, click **Save** to save the dashboard.
|
||||||
|
|
||||||
Notes can be helpful if you need to revert the dashboard to a previous version.
|
Alternatively, click **Apply** if you want to see your changes applied to the dashboard first. Then click the save icon in the dashboard header.
|
||||||
|
|
||||||
|
1. Enter a name for your dashboard and select a folder, if applicable.
|
||||||
|
1. Click **Save**.
|
||||||
|
|
||||||
## Configure repeating rows
|
## Configure repeating rows
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Modify dashboard settings
|
title: Modify dashboard settings
|
||||||
menuTitle: Dashboard settings
|
menuTitle: Modify dashboard settings
|
||||||
weight: 8
|
weight: 8
|
||||||
keywords:
|
keywords:
|
||||||
- time settings
|
- time settings
|
||||||
@@ -12,7 +12,7 @@ keywords:
|
|||||||
|
|
||||||
# Modify dashboard settings
|
# Modify dashboard settings
|
||||||
|
|
||||||
The dashboard settings page enables you to:
|
The dashboard settings page allows you to:
|
||||||
|
|
||||||
- Edit general dashboard properties, including time settings
|
- Edit general dashboard properties, including time settings
|
||||||
- Add annotation queries
|
- Add annotation queries
|
||||||
@@ -31,7 +31,7 @@ Adjust dashboard time settings when you want to change the dashboard timezone, t
|
|||||||
|
|
||||||
1. On the **Dashboard settings** page, click **General**.
|
1. On the **Dashboard settings** page, click **General**.
|
||||||
1. Navigate to the **Time Options** section.
|
1. Navigate to the **Time Options** section.
|
||||||
1. Specify time settings according to the following descriptions.
|
1. Specify time settings as follows.
|
||||||
|
|
||||||
- **Timezone:** Specify the local time zone of the service or system that you are monitoring. This can be helpful when monitoring a system or service that operates across several time zones.
|
- **Timezone:** Specify the local time zone of the service or system that you are monitoring. This can be helpful when monitoring a system or service that operates across several time zones.
|
||||||
- **Default:** Grafana uses the default selected time zone for the user profile, team, or organization. If no time zone is specified for the user profile, a team the user is a member of, or the organization, then Grafana uses the local browser time.
|
- **Default:** Grafana uses the default selected time zone for the user profile, team, or organization. If no time zone is specified for the user profile, a team the user is a member of, or the organization, then Grafana uses the local browser time.
|
||||||
@@ -62,7 +62,7 @@ the dashboard. These dropdowns make it easy to change the data being displayed i
|
|||||||
For more information about variables, refer to [Variables]({{< relref "../../variables/" >}}).
|
For more information about variables, refer to [Variables]({{< relref "../../variables/" >}}).
|
||||||
|
|
||||||
1. On the **Dashboard settings** page, click **Variable** in the left side section menu and then the **Add variable** button.
|
1. On the **Dashboard settings** page, click **Variable** in the left side section menu and then the **Add variable** button.
|
||||||
1. In the **General** section, the the name of the variable. This is the name that you will later use in queries.
|
1. In the **General** section, the name of the variable. This is the name that you will later use in queries.
|
||||||
1. Select a variable **Type**.
|
1. Select a variable **Type**.
|
||||||
|
|
||||||
> **Note:** The variable type you select impacts which fields you populate on the page.
|
> **Note:** The variable type you select impacts which fields you populate on the page.
|
||||||
@@ -74,7 +74,7 @@ For more information about variables, refer to [Variables]({{< relref "../../var
|
|||||||
Dashboard links enable you to place links to other dashboards and web sites directly below the dashboard header. Links provide for easy navigation to other, related dashboards and content.
|
Dashboard links enable you to place links to other dashboards and web sites directly below the dashboard header. Links provide for easy navigation to other, related dashboards and content.
|
||||||
|
|
||||||
1. On the **Dashboard settings** page, click **Links** in the left side section menu and then the **Add link** button.
|
1. On the **Dashboard settings** page, click **Links** in the left side section menu and then the **Add link** button.
|
||||||
1. Enter title and and in the **Type** field, select **Dashboard** or **Link**.
|
1. Enter title and in the **Type** field, select **Dashboard** or **Link**.
|
||||||
1. To add a dashboard link:
|
1. To add a dashboard link:
|
||||||
a. Add an optional tag. Tags are useful creating a dynamic dropdown of dashboards that all have a specific tag.
|
a. Add an optional tag. Tags are useful creating a dynamic dropdown of dashboards that all have a specific tag.
|
||||||
b. Select any of the dashboard link **Options**.
|
b. Select any of the dashboard link **Options**.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user