Compare commits
588 Commits
sriram/SQL
...
v9.5.x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8469ec4677 | ||
|
|
90c9420762 | ||
|
|
d7f95bc933 | ||
|
|
2dd6ebef03 | ||
|
|
9620d44f22 | ||
|
|
97228f2b08 | ||
|
|
1ba88b5b68 | ||
|
|
4767f1bd25 | ||
|
|
b21a76bd75 | ||
|
|
a424f19849 | ||
|
|
ef7d5f4b38 | ||
|
|
c35f59c747 | ||
|
|
dd4eea5e9a | ||
|
|
a5c37a0e0a | ||
|
|
6fe22533b0 | ||
|
|
4c6c31e7b1 | ||
|
|
b6c0f0624e | ||
|
|
b48cd90efa | ||
|
|
6c18c0bf48 | ||
|
|
0aeb51bae8 | ||
|
|
e1f763fc38 | ||
|
|
70d64c57dc | ||
|
|
b43c78182d | ||
|
|
9a3a8d5dcb | ||
|
|
096d0caaa2 | ||
|
|
a453a065be | ||
|
|
1ba5cd9853 | ||
|
|
75475f2675 | ||
|
|
fb3ef50b84 | ||
|
|
0a01a3047c | ||
|
|
c3b2e4fe66 | ||
|
|
9f682fbe97 | ||
|
|
445da1739f | ||
|
|
4b9458cccd | ||
|
|
942736ff15 | ||
|
|
6644809fa8 | ||
|
|
dda05484cf | ||
|
|
45d252642e | ||
|
|
f0891d4710 | ||
|
|
910c7c5cdd | ||
|
|
f4c5a603b2 | ||
|
|
bcb4317acc | ||
|
|
6cd0bc3114 | ||
|
|
48fb2ab44c | ||
|
|
691a00f7a1 | ||
|
|
68b350c5e6 | ||
|
|
8e8a4ce028 | ||
|
|
bc54e276dd | ||
|
|
ae6c1ee824 | ||
|
|
d6feb8474f | ||
|
|
822e55972b | ||
|
|
ec7f93ef4b | ||
|
|
b16c2bd065 | ||
|
|
97cf7a5545 | ||
|
|
86125a39fd | ||
|
|
c1a270be35 | ||
|
|
d41e3d4e28 | ||
|
|
eddd44d999 | ||
|
|
03fda25f92 | ||
|
|
d9c038c93f | ||
|
|
9c8c4a5574 | ||
|
|
bbd2df6631 | ||
|
|
61d4d06253 | ||
|
|
ab74869935 | ||
|
|
bd9d3f77c1 | ||
|
|
4c9d69376f | ||
|
|
825ea04a9c | ||
|
|
f9f12d9746 | ||
|
|
ae46e25a3a | ||
|
|
ae395a80b5 | ||
|
|
5f5a096c79 | ||
|
|
ee05de1d4b | ||
|
|
427ccf3154 | ||
|
|
314117a02b | ||
|
|
65320de220 | ||
|
|
926a1d0aee | ||
|
|
0f3360514e | ||
|
|
1069ba6e30 | ||
|
|
bed506041d | ||
|
|
9529b7656f | ||
|
|
d250d5bc90 | ||
|
|
ef2bcdc687 | ||
|
|
84729d670c | ||
|
|
3868db77ef | ||
|
|
0c4f2a919b | ||
|
|
ac40e60cf4 | ||
|
|
71023f77c6 | ||
|
|
eb4bca2399 | ||
|
|
f82b429f32 | ||
|
|
9c9f13f1ed | ||
|
|
21c17f098d | ||
|
|
b053f58827 | ||
|
|
9598e8783b | ||
|
|
0b55a53a47 | ||
|
|
cea23d3d38 | ||
|
|
25df0c3f0a | ||
|
|
b60d01ca62 | ||
|
|
caffe6d5db | ||
|
|
79b8343e28 | ||
|
|
ffff1700b4 | ||
|
|
52d5880873 | ||
|
|
cedcbd15e4 | ||
|
|
002f6a02ca | ||
|
|
3af839b682 | ||
|
|
76db2414d8 | ||
|
|
ba029d4131 | ||
|
|
bf45cc47e6 | ||
|
|
2e2c65931c | ||
|
|
7d29800c64 | ||
|
|
97d12a4a01 | ||
|
|
f4b46e5485 | ||
|
|
56f430f7ff | ||
|
|
b52b829ece | ||
|
|
9038465a82 | ||
|
|
4c3cf0fb4c | ||
|
|
30e3d7f6c5 | ||
|
|
e83d21227d | ||
|
|
e748a4c18e | ||
|
|
960f9c12e9 | ||
|
|
3f19cc89fa | ||
|
|
6430b48243 | ||
|
|
46744205c1 | ||
|
|
9d5f886299 | ||
|
|
88c167c85d | ||
|
|
1f8c35535e | ||
|
|
d1a1264975 | ||
|
|
87e107f6d2 | ||
|
|
24f88cfaf5 | ||
|
|
2037e9d0a3 | ||
|
|
c799a37393 | ||
|
|
163cc84699 | ||
|
|
742f373aae | ||
|
|
80077dce53 | ||
|
|
63ed5dd01a | ||
|
|
5fd5af12d5 | ||
|
|
e5ef5bb4bb | ||
|
|
a76927f7a3 | ||
|
|
56e07f9c55 | ||
|
|
fec166eb23 | ||
|
|
f0d1dcf726 | ||
|
|
e630d7cf2e | ||
|
|
563bd4a653 | ||
|
|
cc10c645d6 | ||
|
|
91e9369474 | ||
|
|
5ff999bdae | ||
|
|
45ea90a251 | ||
|
|
eb4b6e45b7 | ||
|
|
25a403cf78 | ||
|
|
f7b7e3c557 | ||
|
|
ca1ad7fc53 | ||
|
|
a8befdcfcf | ||
|
|
6285daa89b | ||
|
|
ff8fbd0b63 | ||
|
|
d7f26914e9 | ||
|
|
30ee1a55ea | ||
|
|
4a1f7d0988 | ||
|
|
357ccd9d85 | ||
|
|
f11774dff5 | ||
|
|
eee5f5c720 | ||
|
|
7ae72da72a | ||
|
|
7e416a731d | ||
|
|
3aff7440ee | ||
|
|
6d864e705e | ||
|
|
a45d292bf6 | ||
|
|
4d666018c0 | ||
|
|
084a3e2b34 | ||
|
|
b612804b16 | ||
|
|
e256a4229e | ||
|
|
a33296ff7e | ||
|
|
29154b2c4f | ||
|
|
5ae435971f | ||
|
|
3578c80b2c | ||
|
|
25cd2e59bb | ||
|
|
c811eb747d | ||
|
|
f29ce9b29d | ||
|
|
8154f070c8 | ||
|
|
fb4796e1e2 | ||
|
|
9a6be573ec | ||
|
|
c452a2bf00 | ||
|
|
eb18822140 | ||
|
|
15d0b852da | ||
|
|
dbcd05b9b3 | ||
|
|
d61e4f49c8 | ||
|
|
da3daa76b9 | ||
|
|
47b1e21580 | ||
|
|
f23fb5ef43 | ||
|
|
8fdb609c86 | ||
|
|
0c612ae868 | ||
|
|
e7e175b0a8 | ||
|
|
759dd42abf | ||
|
|
c1ef527b0b | ||
|
|
f645bff316 | ||
|
|
aa80c1ceda | ||
|
|
b33d4c3289 | ||
|
|
2b95fdc7e7 | ||
|
|
82e675e20a | ||
|
|
f6139ceab4 | ||
|
|
b1916959ba | ||
|
|
6c0cf98659 | ||
|
|
3cdd6c540e | ||
|
|
358f917633 | ||
|
|
464590f622 | ||
|
|
c81056922d | ||
|
|
817613f52e | ||
|
|
bd5728df22 | ||
|
|
de3b289831 | ||
|
|
558956f3d8 | ||
|
|
d38393f32d | ||
|
|
1ad544b293 | ||
|
|
751d35c396 | ||
|
|
b8ac666ea5 | ||
|
|
5df1da3a16 | ||
|
|
68b4bb4a2b | ||
|
|
be375d3946 | ||
|
|
abe1c6825c | ||
|
|
d5ba847d92 | ||
|
|
a7302e7cc4 | ||
|
|
36f1080ba6 | ||
|
|
4b0cec9803 | ||
|
|
e9df423b20 | ||
|
|
852ef5a946 | ||
|
|
2ccd7acb9b | ||
|
|
ba60a8bb1d | ||
|
|
905a79b17c | ||
|
|
841cd57d4e | ||
|
|
9dc78e3db1 | ||
|
|
8a85daf982 | ||
|
|
994d78334a | ||
|
|
443c6a796d | ||
|
|
c47c8ddf14 | ||
|
|
b93e956c7a | ||
|
|
10b7bd76f5 | ||
|
|
6b12749b57 | ||
|
|
907445beef | ||
|
|
1dd68f2d2b | ||
|
|
479b5c0fad | ||
|
|
de52d2b2c5 | ||
|
|
d1eaa139e1 | ||
|
|
2a6b7d1065 | ||
|
|
b669afdfda | ||
|
|
3ee1f7ac83 | ||
|
|
4f944c691a | ||
|
|
fbfd77d322 | ||
|
|
6721e7be68 | ||
|
|
c91314f701 | ||
|
|
b51a8063c1 | ||
|
|
b9dce4329e | ||
|
|
84a4b8be6f | ||
|
|
a77d02177a | ||
|
|
f984e20f0c | ||
|
|
4bcfe82aac | ||
|
|
02fe2856da | ||
|
|
2755a139e9 | ||
|
|
471f34a079 | ||
|
|
3b30a16586 | ||
|
|
2dc4a76e90 | ||
|
|
2e827123b8 | ||
|
|
41af852171 | ||
|
|
eb8d9f5a34 | ||
|
|
a279c804db | ||
|
|
4b0b2eede2 | ||
|
|
fd80720221 | ||
|
|
2745d3b5a1 | ||
|
|
b585067281 | ||
|
|
7f6a309614 | ||
|
|
a3031e5280 | ||
|
|
16eeaeb5ff | ||
|
|
3a3fa60e78 | ||
|
|
54c462c050 | ||
|
|
604304b3d2 | ||
|
|
debeb6212e | ||
|
|
cd663704c6 | ||
|
|
51ae8e5857 | ||
|
|
f2cee74902 | ||
|
|
8e32be59e0 | ||
|
|
7e31fff512 | ||
|
|
119a88665e | ||
|
|
614079fcd9 | ||
|
|
bef41a5cc9 | ||
|
|
dd7d0e8883 | ||
|
|
c833a174bd | ||
|
|
d9382b0a9b | ||
|
|
7dd3df7986 | ||
|
|
2f713952ba | ||
|
|
d502a8522d | ||
|
|
4ec3087f5a | ||
|
|
def2a16ef6 | ||
|
|
2e350d13bb | ||
|
|
824a38bcc6 | ||
|
|
973e8dc7c4 | ||
|
|
7d6d704e88 | ||
|
|
47a125529b | ||
|
|
ac79a0660e | ||
|
|
9c86893349 | ||
|
|
ab715a035f | ||
|
|
afd6dc96c9 | ||
|
|
9206c8d5f8 | ||
|
|
b0f4eac505 | ||
|
|
cc088dd6a4 | ||
|
|
9a3d3a7f8a | ||
|
|
0882b84c27 | ||
|
|
6db244abb8 | ||
|
|
2fdbcba8fc | ||
|
|
ff3cceb724 | ||
|
|
fc3c608ccd | ||
|
|
423872780b | ||
|
|
e85a6913ab | ||
|
|
92ebb4bac3 | ||
|
|
ec3364fd2f | ||
|
|
4694182dbb | ||
|
|
c62289f2d4 | ||
|
|
b5aaebf4fc | ||
|
|
9f059499e9 | ||
|
|
fb2ae9abca | ||
|
|
e7f27f1706 | ||
|
|
687d976461 | ||
|
|
4784c9a99a | ||
|
|
9db334ad95 | ||
|
|
342ad7fd1d | ||
|
|
87c29d94f5 | ||
|
|
e381b00859 | ||
|
|
72e0696780 | ||
|
|
d27e48cfe7 | ||
|
|
eb8b96ec87 | ||
|
|
cf3a2b56c2 | ||
|
|
93938867ad | ||
|
|
d1f79e7096 | ||
|
|
2b84887e50 | ||
|
|
a1d66bf368 | ||
|
|
e4fb61b854 | ||
|
|
a3c8fd3e9b | ||
|
|
0f9f72d46b | ||
|
|
82a1ef9e79 | ||
|
|
4e6fd701f7 | ||
|
|
8f9c2e6198 | ||
|
|
df7cf9cafd | ||
|
|
d6dd707e29 | ||
|
|
59e33994cf | ||
|
|
5bddebc140 | ||
|
|
394d139ef9 | ||
|
|
25562a0cc1 | ||
|
|
9d132493d2 | ||
|
|
184ad79c68 | ||
|
|
d2244b18ee | ||
|
|
0bd8fb3dca | ||
|
|
f3ee778e1a | ||
|
|
b1d90da73d | ||
|
|
e43c174f13 | ||
|
|
1d54585a63 | ||
|
|
adbcf7dee0 | ||
|
|
b153b4ede0 | ||
|
|
16f3df46f2 | ||
|
|
ce8732208e | ||
|
|
401577687c | ||
|
|
54cc55cb6d | ||
|
|
99359710ab | ||
|
|
676da1c7e9 | ||
|
|
3bae8c5cf1 | ||
|
|
dde555df3a | ||
|
|
9bc710d5e6 | ||
|
|
aeea508b42 | ||
|
|
08ea5c94c6 | ||
|
|
f74b514e1a | ||
|
|
86e6d9d377 | ||
|
|
99c1a4c171 | ||
|
|
180f0dac6b | ||
|
|
8a8d1e6ff2 | ||
|
|
7d33529218 | ||
|
|
d16b23ca86 | ||
|
|
de0d8c7012 | ||
|
|
5ce8bc3821 | ||
|
|
deb33e5f39 | ||
|
|
896ddabb60 | ||
|
|
c04c5ddcf1 | ||
|
|
785800fe3a | ||
|
|
38fdb3f1ee | ||
|
|
f811cbc5a7 | ||
|
|
2a566dddfd | ||
|
|
100d66cf36 | ||
|
|
f2059d7abb | ||
|
|
9c797800f0 | ||
|
|
aa06e63149 | ||
|
|
17f349b33d | ||
|
|
dd20653087 | ||
|
|
0a1e56ed86 | ||
|
|
5e2559597a | ||
|
|
70641c7718 | ||
|
|
9533da75de | ||
|
|
7f3371e4d2 | ||
|
|
335c71c92f | ||
|
|
405886acb4 | ||
|
|
5477297d10 | ||
|
|
45a60cf9d1 | ||
|
|
749d77e8bc | ||
|
|
2a41843a5c | ||
|
|
cf49bbe560 | ||
|
|
dd33560f5e | ||
|
|
167b268b81 | ||
|
|
a0f253c62b | ||
|
|
c95eda4b35 | ||
|
|
8ef9345b1a | ||
|
|
b4f3d14cc5 | ||
|
|
7d0af2f141 | ||
|
|
87c72dff9f | ||
|
|
ffc15bb42d | ||
|
|
f1d95b2157 | ||
|
|
3504573574 | ||
|
|
cdf6cd7323 | ||
|
|
b28ec49d2a | ||
|
|
7ca4b317c5 | ||
|
|
a07a0ef3b5 | ||
|
|
3c6625fe9e | ||
|
|
bc945cd1b0 | ||
|
|
2c899b3f68 | ||
|
|
f1691b0049 | ||
|
|
b498ebfa2d | ||
|
|
7045de2aa3 | ||
|
|
6b77a9ae80 | ||
|
|
aca84878a2 | ||
|
|
c7aad654e2 | ||
|
|
5bfb970009 | ||
|
|
ac5bcf32ae | ||
|
|
0c0a5ed602 | ||
|
|
4b6ce21884 | ||
|
|
8fc8a5e208 | ||
|
|
aebf6e7fc1 | ||
|
|
afa03930ec | ||
|
|
4aa8877ef1 | ||
|
|
8fad8a35c2 | ||
|
|
253ce61128 | ||
|
|
52ef99fcc7 | ||
|
|
c9d8a5c6b5 | ||
|
|
58c9a64e88 | ||
|
|
9262308c7f | ||
|
|
d1731c2abc | ||
|
|
38f6989e66 | ||
|
|
d0cd9f78e4 | ||
|
|
baf887a3c8 | ||
|
|
8cac9b28a0 | ||
|
|
fc10666f03 | ||
|
|
508d3d665f | ||
|
|
44e3189bf2 | ||
|
|
ed38abd70b | ||
|
|
090ef70f95 | ||
|
|
bc6f19f130 | ||
|
|
0998fd708c | ||
|
|
dccb25eae0 | ||
|
|
535ae47e2f | ||
|
|
a0587aa6cd | ||
|
|
5bc27fde9d | ||
|
|
792e80b65d | ||
|
|
ff79e2df57 | ||
|
|
8e7f6c231a | ||
|
|
ba86c60a1e | ||
|
|
9061f5ba0d | ||
|
|
c5493602df | ||
|
|
5866d71d65 | ||
|
|
de1ccc792d | ||
|
|
83034c711a | ||
|
|
864ab4dac0 | ||
|
|
1bea5dfeec | ||
|
|
147b0a21d6 | ||
|
|
435a7a7708 | ||
|
|
0009506829 | ||
|
|
2c52304ee6 | ||
|
|
ed10eebb48 | ||
|
|
fab6a375ca | ||
|
|
503a654dc5 | ||
|
|
5bfb520830 | ||
|
|
2cce94c70d | ||
|
|
33475a38f5 | ||
|
|
1c7f9e136e | ||
|
|
38bbb1e891 | ||
|
|
b0146a6d6b | ||
|
|
92fa914302 | ||
|
|
b8c5828b86 | ||
|
|
963cd42fcc | ||
|
|
f373eca377 | ||
|
|
c3d1930d05 | ||
|
|
02e1181c3b | ||
|
|
827cc6f1c8 | ||
|
|
fa1bd24b47 | ||
|
|
8357ceae7b | ||
|
|
dda934678d | ||
|
|
8bc2a7144a | ||
|
|
6c0aeb452d | ||
|
|
38fdfd6bfc | ||
|
|
900c18ef5b | ||
|
|
ae716112dc | ||
|
|
d153c50454 | ||
|
|
7694ea28e5 | ||
|
|
32869c96df | ||
|
|
2ed30e9831 | ||
|
|
5bb4a9c89f | ||
|
|
dcc5190620 | ||
|
|
006cea2192 | ||
|
|
384a21d03c | ||
|
|
71ebf83dd0 | ||
|
|
581cbe4295 | ||
|
|
3133aa135d | ||
|
|
e9b2eb1607 | ||
|
|
e6eb1df488 | ||
|
|
f0ae1b41b5 | ||
|
|
ad9dd6a1dd | ||
|
|
0315b911ef | ||
|
|
33ff08215c | ||
|
|
6a1a71f8bd | ||
|
|
826e500bf2 | ||
|
|
3fb37e26b5 | ||
|
|
81b78f3af4 | ||
|
|
9afddd77bd | ||
|
|
760146aeab | ||
|
|
bd63388bc5 | ||
|
|
c035abf529 | ||
|
|
68d2179aa2 | ||
|
|
08f57ef45c | ||
|
|
7f1a840f36 | ||
|
|
5e07346da9 | ||
|
|
c5352a10fe | ||
|
|
1433fcb9b2 | ||
|
|
4cd346e66c | ||
|
|
84850f4553 | ||
|
|
5bcc35298f | ||
|
|
ac7eecdb47 | ||
|
|
2fda756320 | ||
|
|
12c2bbfc56 | ||
|
|
6b68549bb4 | ||
|
|
0b9ef6d3f4 | ||
|
|
014b77bb79 | ||
|
|
61fe7dccb8 | ||
|
|
abd9543c14 | ||
|
|
3369033d74 | ||
|
|
b5cb0e5cc6 | ||
|
|
d40a837d5c | ||
|
|
0f4a76c9de | ||
|
|
0f10b98202 | ||
|
|
fde8d81de3 | ||
|
|
12d121a1fc | ||
|
|
c956cd2a32 | ||
|
|
c52f932025 | ||
|
|
522598d650 | ||
|
|
f26e56bc43 | ||
|
|
348ced74b4 | ||
|
|
1ad3ee4255 | ||
|
|
a38b4cf3b0 | ||
|
|
f09b60467e | ||
|
|
122a38543c | ||
|
|
8f9edf19a3 | ||
|
|
fe530beebd | ||
|
|
2e866faac4 | ||
|
|
f5063b3805 | ||
|
|
97164ed37e | ||
|
|
1ef8c02d19 | ||
|
|
345909d74b | ||
|
|
ba3f3ec59d | ||
|
|
37883ed9ef | ||
|
|
c1136a48b2 | ||
|
|
acf9030e26 | ||
|
|
cf31c0b7bd | ||
|
|
7159c79069 | ||
|
|
7dab288d64 | ||
|
|
2f550d1f03 | ||
|
|
5aecd7cf1f | ||
|
|
1bb827d634 | ||
|
|
3b67cebd40 | ||
|
|
8dac8ab37b | ||
|
|
c92d8591cb | ||
|
|
ab8994183d | ||
|
|
e47e901618 | ||
|
|
c9eff57efe | ||
|
|
5f73666f54 | ||
|
|
a63d1714b5 | ||
|
|
9c7b4e0f3f | ||
|
|
a013ee7be4 | ||
|
|
734fb8a3e5 | ||
|
|
ec109a913b | ||
|
|
7104dc3fef | ||
|
|
a6a9e4e0ed | ||
|
|
62e0b45067 | ||
|
|
0f0e2664cc | ||
|
|
1dc26665f3 | ||
|
|
b68716e9eb | ||
|
|
638a277364 | ||
|
|
c7cc68649d | ||
|
|
119fb76938 | ||
|
|
fbb66e6b9f | ||
|
|
ea8d17009f | ||
|
|
f34d0df862 |
@@ -2523,8 +2523,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"]
|
|
||||||
],
|
],
|
||||||
"public/app/features/dashboard/state/DashboardModel.test.ts:5381": [
|
"public/app/features/dashboard/state/DashboardModel.test.ts:5381": [
|
||||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||||
@@ -3139,27 +3138,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"]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT.
|
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.9. 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.51.2
|
GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.59.1
|
||||||
$(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.51.2"
|
@echo "(re)installing $(GOBIN)/golangci-lint-v1.59.1"
|
||||||
@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"
|
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.59.1 "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
|
||||||
@@ -53,9 +53,9 @@ $(SWAGGER): $(BINGO_DIR)/swagger.mod
|
|||||||
@echo "(re)installing $(GOBIN)/swagger-v0.30.2"
|
@echo "(re)installing $(GOBIN)/swagger-v0.30.2"
|
||||||
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=swagger.mod -o=$(GOBIN)/swagger-v0.30.2 "github.com/go-swagger/go-swagger/cmd/swagger"
|
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=swagger.mod -o=$(GOBIN)/swagger-v0.30.2 "github.com/go-swagger/go-swagger/cmd/swagger"
|
||||||
|
|
||||||
WIRE := $(GOBIN)/wire-v0.5.0
|
WIRE := $(GOBIN)/wire-v0.6.0
|
||||||
$(WIRE): $(BINGO_DIR)/wire.mod
|
$(WIRE): $(BINGO_DIR)/wire.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)/wire-v0.5.0"
|
@echo "(re)installing $(GOBIN)/wire-v0.6.0"
|
||||||
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=wire.mod -o=$(GOBIN)/wire-v0.5.0 "github.com/google/wire/cmd/wire"
|
@cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=wire.mod -o=$(GOBIN)/wire-v0.6.0 "github.com/google/wire/cmd/wire"
|
||||||
|
|
||||||
|
|||||||
@@ -5,26 +5,52 @@ cuelang.org/go v0.5.0-beta.2/go.mod h1:okjJBHFQFer+a41sAe2SaGm1glWS8oEb6CmJvn5Zd
|
|||||||
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
|
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
|
||||||
github.com/cockroachdb/apd/v2 v2.0.1 h1:y1Rh3tEU89D+7Tgbw+lp52T6p/GJLpDmNvr10UWqLTE=
|
github.com/cockroachdb/apd/v2 v2.0.1 h1:y1Rh3tEU89D+7Tgbw+lp52T6p/GJLpDmNvr10UWqLTE=
|
||||||
github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E=
|
github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E=
|
||||||
|
github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/emicklei/proto v1.6.15 h1:XbpwxmuOPrdES97FrSfpyy67SSCV/wBIKXqgJzh6hNw=
|
github.com/emicklei/proto v1.6.15 h1:XbpwxmuOPrdES97FrSfpyy67SSCV/wBIKXqgJzh6hNw=
|
||||||
github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw=
|
github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw=
|
||||||
|
github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
|
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
|
||||||
|
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
|
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
|
||||||
|
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
|
||||||
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto=
|
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto=
|
||||||
|
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY=
|
||||||
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc h1:gSVONBi2HWMFXCa9jFdYvYk7IwW/mTLxWOF7rXS4LO0=
|
github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc h1:gSVONBi2HWMFXCa9jFdYvYk7IwW/mTLxWOF7rXS4LO0=
|
||||||
github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b h1:zd/2RNzIRkoGGMjE+YIsZ85CnDIz672JK2F3Zl4vux4=
|
github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b h1:zd/2RNzIRkoGGMjE+YIsZ85CnDIz672JK2F3Zl4vux4=
|
||||||
|
github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b/go.mod h1:KjY0wibdYKc4DYkerHSbguaf3JeIPGhNJBp2BNiFH78=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
|
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
|
||||||
|
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 h1:xUIPaMhvROX9dhPvRCenIJtU78+lbEenGbgqB5hfHCQ=
|
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 h1:xUIPaMhvROX9dhPvRCenIJtU78+lbEenGbgqB5hfHCQ=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220818022119-ed83ed61efb9 h1:VtCrPQXM5Wo9l7XN64SjBMczl48j8mkP+2e3OhYlz+0=
|
golang.org/x/mod v0.6.0-dev.0.20220818022119-ed83ed61efb9 h1:VtCrPQXM5Wo9l7XN64SjBMczl48j8mkP+2e3OhYlz+0=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220818022119-ed83ed61efb9/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
|
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/tools v0.0.0-20200612220849-54c614fe050c h1:g6oFfz6Cmw68izP3xsdud3Oxu145IPkeFzyRg58AKHM=
|
golang.org/x/tools v0.0.0-20200612220849-54c614fe050c h1:g6oFfz6Cmw68izP3xsdud3Oxu145IPkeFzyRg58AKHM=
|
||||||
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB
|
|||||||
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
||||||
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
|
github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w=
|
||||||
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||||
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
||||||
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
|
||||||
@@ -897,6 +898,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
|
|||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
|
||||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
|
module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
|
||||||
|
|
||||||
go 1.20
|
go 1.22.5
|
||||||
|
|
||||||
require github.com/golangci/golangci-lint v1.51.2 // cmd/golangci-lint
|
require github.com/golangci/golangci-lint v1.59.1 // cmd/golangci-lint
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,86 +1,706 @@
|
|||||||
|
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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
|
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||||
|
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
|
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
|
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||||
|
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||||
|
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||||
|
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||||
|
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||||
|
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||||
|
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||||
|
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||||
|
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||||
|
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||||
|
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
|
||||||
|
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
|
||||||
|
cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
|
||||||
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
|
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||||
|
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||||
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
|
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||||
|
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||||
|
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||||
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
|
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
|
||||||
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
|
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
|
||||||
|
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||||
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
|
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
|
||||||
|
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||||
github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
|
github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
|
||||||
|
github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
|
||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
|
||||||
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
|
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
|
||||||
|
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
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/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
|
github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
|
||||||
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
|
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
|
||||||
|
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
|
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
|
||||||
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
|
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
|
||||||
|
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||||
|
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-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU=
|
github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU=
|
||||||
|
github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY=
|
||||||
github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc=
|
github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc=
|
||||||
|
github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo=
|
||||||
|
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
|
||||||
|
github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
|
||||||
github.com/go-openapi/errors v0.20.2 h1:dxy7PGTqEh94zj2E3h1cUmQQWiM1+aeCROfAr02EmK8=
|
github.com/go-openapi/errors v0.20.2 h1:dxy7PGTqEh94zj2E3h1cUmQQWiM1+aeCROfAr02EmK8=
|
||||||
|
github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
|
||||||
github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc=
|
github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc=
|
||||||
|
github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk=
|
||||||
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
|
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
|
||||||
|
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
|
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
|
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
|
||||||
github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=
|
github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=
|
||||||
|
github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
|
||||||
github.com/go-openapi/loads v0.21.0 h1:jYtUO4wwP7psAweisP/MDoOpdzsYEESdoPcsWjHDR68=
|
github.com/go-openapi/loads v0.21.0 h1:jYtUO4wwP7psAweisP/MDoOpdzsYEESdoPcsWjHDR68=
|
||||||
|
github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g=
|
||||||
github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro=
|
github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro=
|
||||||
|
github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw=
|
||||||
github.com/go-openapi/runtime v0.21.1 h1:/KIG00BzA2x2HRStX2tnhbqbQdPcFlkgsYCiNY20FZs=
|
github.com/go-openapi/runtime v0.21.1 h1:/KIG00BzA2x2HRStX2tnhbqbQdPcFlkgsYCiNY20FZs=
|
||||||
github.com/go-openapi/runtime v0.24.1 h1:Sml5cgQKGYQHF+M7yYSHaH1eOjvTykrddTE/KtQVjqo=
|
github.com/go-openapi/runtime v0.24.1 h1:Sml5cgQKGYQHF+M7yYSHaH1eOjvTykrddTE/KtQVjqo=
|
||||||
|
github.com/go-openapi/runtime v0.24.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk=
|
||||||
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
|
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
|
||||||
|
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
|
||||||
|
github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
|
||||||
github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI=
|
github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI=
|
||||||
|
github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
|
||||||
|
github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg=
|
||||||
github.com/go-openapi/strfmt v0.21.1 h1:G6s2t5V5kGCHLVbSdZ/6lI8Wm4OzoPFkc3/cjAsKQrM=
|
github.com/go-openapi/strfmt v0.21.1 h1:G6s2t5V5kGCHLVbSdZ/6lI8Wm4OzoPFkc3/cjAsKQrM=
|
||||||
|
github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k=
|
||||||
|
github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k=
|
||||||
github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o=
|
github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o=
|
||||||
|
github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg=
|
||||||
|
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
|
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
|
||||||
|
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
||||||
|
github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
||||||
github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
|
github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
|
||||||
|
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||||
github.com/go-openapi/validate v0.20.3 h1:GZPPhhKSZrE8HjB4eEkoYAZmoWA4+tCemSgINH1/vKw=
|
github.com/go-openapi/validate v0.20.3 h1:GZPPhhKSZrE8HjB4eEkoYAZmoWA4+tCemSgINH1/vKw=
|
||||||
|
github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg=
|
||||||
github.com/go-openapi/validate v0.22.0 h1:b0QecH6VslW/TxtpKgzpO1SNG7GU2FsaqKdP1E2T50Y=
|
github.com/go-openapi/validate v0.22.0 h1:b0QecH6VslW/TxtpKgzpO1SNG7GU2FsaqKdP1E2T50Y=
|
||||||
|
github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
|
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
|
||||||
|
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
|
||||||
github.com/go-swagger/go-swagger v0.29.0 h1:z3YoZtLvS1Y8TE/PCat1VypcZxM0IgKLt0NvZxQyNl8=
|
github.com/go-swagger/go-swagger v0.29.0 h1:z3YoZtLvS1Y8TE/PCat1VypcZxM0IgKLt0NvZxQyNl8=
|
||||||
github.com/go-swagger/go-swagger v0.29.0/go.mod h1:Z4GJzI+bHKKkGB2Ji1rawpi3/ldXX8CkzGIa9HAC5EE=
|
github.com/go-swagger/go-swagger v0.29.0/go.mod h1:Z4GJzI+bHKKkGB2Ji1rawpi3/ldXX8CkzGIa9HAC5EE=
|
||||||
github.com/go-swagger/go-swagger v0.30.2 h1:23odPUyQZdkNFZZSBJ3mqYYcdh+LnuReEbdWN18OMRo=
|
github.com/go-swagger/go-swagger v0.30.2 h1:23odPUyQZdkNFZZSBJ3mqYYcdh+LnuReEbdWN18OMRo=
|
||||||
github.com/go-swagger/go-swagger v0.30.2/go.mod h1:neDPes8r8PCz2JPvHRDj8BTULLh4VJUt7n6MpQqxhHM=
|
github.com/go-swagger/go-swagger v0.30.2/go.mod h1:neDPes8r8PCz2JPvHRDj8BTULLh4VJUt7n6MpQqxhHM=
|
||||||
|
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
|
||||||
|
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
|
||||||
|
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
|
||||||
|
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||||
|
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||||
|
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
|
||||||
|
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
|
||||||
|
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
|
||||||
|
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
|
||||||
|
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
|
||||||
|
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
|
||||||
|
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
|
||||||
|
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
|
||||||
|
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
|
||||||
|
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
|
||||||
|
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
|
||||||
|
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
|
||||||
|
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
|
||||||
|
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
|
||||||
|
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
|
||||||
|
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
|
||||||
|
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
|
||||||
|
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
|
||||||
|
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
|
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
|
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
|
||||||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||||
|
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
|
github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||||
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
|
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
|
||||||
|
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||||
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
|
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
|
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
||||||
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
|
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
|
||||||
|
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||||
|
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||||
|
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||||
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
|
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
|
||||||
|
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||||
|
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
|
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
|
||||||
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
|
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
|
||||||
|
github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
|
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
|
||||||
|
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
|
||||||
|
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
||||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
||||||
|
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||||
|
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
|
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
|
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
|
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
|
||||||
|
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
|
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
|
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
|
||||||
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
|
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
|
||||||
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
|
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
|
||||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
||||||
|
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
|
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
|
||||||
|
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
||||||
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||||
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
|
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
|
||||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||||
|
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||||
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
|
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
|
||||||
|
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||||
|
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60=
|
github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60=
|
||||||
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
|
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
|
||||||
|
github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
|
||||||
|
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
|
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
|
||||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||||
|
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
|
||||||
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
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/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
|
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
|
||||||
github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=
|
github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=
|
||||||
|
github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI=
|
||||||
|
github.com/stretchr/objx v0.1.0/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/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||||
github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI=
|
github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI=
|
||||||
|
github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
|
||||||
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
|
github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
|
||||||
|
github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
|
||||||
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
|
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
|
||||||
|
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
||||||
|
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
|
||||||
|
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
||||||
|
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
||||||
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
|
||||||
|
go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng=
|
||||||
go.mongodb.org/mongo-driver v1.8.2 h1:8ssUXufb90ujcIvR6MyE1SchaNj0SFxsakiZgxIyrMk=
|
go.mongodb.org/mongo-driver v1.8.2 h1:8ssUXufb90ujcIvR6MyE1SchaNj0SFxsakiZgxIyrMk=
|
||||||
|
go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
|
||||||
|
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
|
||||||
go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
|
go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
|
||||||
|
go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
|
||||||
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||||
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
|
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
|
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
|
||||||
|
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||||
|
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||||
|
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
|
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/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
|
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
|
||||||
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba h1:6u6sik+bn/y7vILcYkK3iwTBWN7WtBvB0+SZswQnbf8=
|
golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba h1:6u6sik+bn/y7vILcYkK3iwTBWN7WtBvB0+SZswQnbf8=
|
||||||
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
|
||||||
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
|
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
|
||||||
|
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
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.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||||
|
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
|
||||||
|
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w=
|
golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w=
|
||||||
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
|
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
|
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||||
|
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
|
||||||
|
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
|
||||||
|
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||||
|
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||||
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
|
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
||||||
|
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||||
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w=
|
gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w=
|
||||||
gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
|
gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
|
||||||
|
gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
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/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.8. DO NOT EDIT.
|
# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.9. 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,11 +14,11 @@ 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.51.2"
|
GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.59.1"
|
||||||
|
|
||||||
JB="${GOBIN}/jb-v0.5.1"
|
JB="${GOBIN}/jb-v0.5.1"
|
||||||
|
|
||||||
SWAGGER="${GOBIN}/swagger-v0.30.2"
|
SWAGGER="${GOBIN}/swagger-v0.30.2"
|
||||||
|
|
||||||
WIRE="${GOBIN}/wire-v0.5.0"
|
WIRE="${GOBIN}/wire-v0.6.0"
|
||||||
|
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT
|
|||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
require github.com/google/wire v0.5.0 // cmd/wire
|
require github.com/google/wire v0.6.0 // cmd/wire
|
||||||
|
|||||||
@@ -1,13 +1,66 @@
|
|||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k=
|
github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k=
|
||||||
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||||
|
github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE=
|
||||||
|
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||||
github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
|
github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
|
||||||
github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
|
github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
|
||||||
|
github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI=
|
||||||
|
github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||||
|
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
|
||||||
|
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
|
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||||
|
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||||
|
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
|
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||||
|
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||||
|
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||||
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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
|
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b h1:NVD8gBK33xpdqCaZVVtd6OFJp+3dxkXuz7+U7KaVN6s=
|
golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b h1:NVD8gBK33xpdqCaZVVtd6OFJp+3dxkXuz7+U7KaVN6s=
|
||||||
golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
|
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||||
|
golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
|
||||||
|
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
4
.codespellignore
Normal file
4
.codespellignore
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
aks
|
||||||
|
eror
|
||||||
|
iam
|
||||||
|
wan
|
||||||
44
.drone.star
44
.drone.star
@@ -7,53 +7,49 @@
|
|||||||
This module returns a Drone configuration including pipelines and secrets.
|
This module returns a Drone configuration including pipelines and secrets.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
load("scripts/drone/events/pr.star", "pr_pipelines")
|
load("scripts/drone/events/cron.star", "cronjobs")
|
||||||
load("scripts/drone/events/main.star", "main_pipelines")
|
load("scripts/drone/events/main.star", "main_pipelines")
|
||||||
|
load("scripts/drone/events/pr.star", "pr_pipelines")
|
||||||
load(
|
load(
|
||||||
"scripts/drone/events/release.star",
|
"scripts/drone/events/release.star",
|
||||||
"artifacts_page_pipeline",
|
|
||||||
"enterprise2_pipelines",
|
|
||||||
"enterprise_pipelines",
|
|
||||||
"integration_test_pipelines",
|
"integration_test_pipelines",
|
||||||
"oss_pipelines",
|
|
||||||
"publish_artifacts_pipelines",
|
"publish_artifacts_pipelines",
|
||||||
"publish_npm_pipelines",
|
"publish_npm_pipelines",
|
||||||
"publish_packages_pipeline",
|
"publish_packages_pipeline",
|
||||||
)
|
)
|
||||||
|
load(
|
||||||
|
"scripts/drone/pipelines/ci_images.star",
|
||||||
|
"publish_ci_windows_test_image_pipeline",
|
||||||
|
)
|
||||||
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/windows.star",
|
||||||
load("scripts/drone/version.star", "version_branch_pipelines")
|
"windows_test_backend",
|
||||||
load("scripts/drone/events/cron.star", "cronjobs")
|
)
|
||||||
|
load(
|
||||||
|
"scripts/drone/rgm.star",
|
||||||
|
"rgm",
|
||||||
|
)
|
||||||
load("scripts/drone/vault.star", "secrets")
|
load("scripts/drone/vault.star", "secrets")
|
||||||
|
|
||||||
def main(_ctx):
|
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() +
|
||||||
version_branch_pipelines() +
|
[windows_test_backend({
|
||||||
|
"event": ["promote"],
|
||||||
|
"target": ["test-windows"],
|
||||||
|
}, "oss", "testing")] +
|
||||||
integration_test_pipelines() +
|
integration_test_pipelines() +
|
||||||
|
publish_ci_windows_test_image_pipeline() +
|
||||||
cronjobs() +
|
cronjobs() +
|
||||||
secrets()
|
secrets()
|
||||||
)
|
)
|
||||||
|
|||||||
6409
.drone.yml
6409
.drone.yml
File diff suppressed because it is too large
Load Diff
51
.github/CODEOWNERS
vendored
51
.github/CODEOWNERS
vendored
@@ -55,6 +55,8 @@
|
|||||||
# Backend code
|
# Backend code
|
||||||
/go.mod @grafana/backend-platform
|
/go.mod @grafana/backend-platform
|
||||||
/go.sum @grafana/backend-platform
|
/go.sum @grafana/backend-platform
|
||||||
|
/go.work @grafana/grafana-app-platform-squad
|
||||||
|
/go.work.sum @grafana/grafana-app-platform-squad
|
||||||
/.bingo/ @grafana/backend-platform
|
/.bingo/ @grafana/backend-platform
|
||||||
/pkg/README.md @grafana/backend-platform
|
/pkg/README.md @grafana/backend-platform
|
||||||
/pkg/ruleguard.rules.go @grafana/backend-platform
|
/pkg/ruleguard.rules.go @grafana/backend-platform
|
||||||
@@ -220,14 +222,15 @@
|
|||||||
|
|
||||||
|
|
||||||
# Continuous Integration
|
# Continuous Integration
|
||||||
.drone.yml @grafana/grafana-delivery
|
.drone.yml @grafana/grafana-release-guild
|
||||||
.drone.star @grafana/grafana-delivery
|
.drone.star @grafana/grafana-release-guild
|
||||||
/scripts/drone/ @grafana/grafana-delivery
|
/scripts/drone/ @grafana/grafana-release-guild
|
||||||
/pkg/build/ @grafana/grafana-delivery
|
/pkg/build/ @grafana/grafana-release-guild
|
||||||
/.dockerignore @grafana/grafana-delivery
|
/.dockerignore @grafana/grafana-release-guild
|
||||||
/Dockerfile @grafana/grafana-delivery
|
/Dockerfile @grafana/grafana-release-guild
|
||||||
/Makefile @grafana/grafana-delivery
|
/Makefile @grafana/grafana-release-guild
|
||||||
/scripts/build/ @grafana/grafana-delivery
|
/scripts/build/ @grafana/grafana-release-guild
|
||||||
|
/scripts/list-release-artifacts.sh @grafana/grafana-release-guild
|
||||||
|
|
||||||
# OSS Plugin Partnerships backend code
|
# OSS Plugin Partnerships backend code
|
||||||
/pkg/tsdb/cloudwatch/ @grafana/aws-datasources
|
/pkg/tsdb/cloudwatch/ @grafana/aws-datasources
|
||||||
@@ -428,6 +431,7 @@ lerna.json @grafana/frontend-ops
|
|||||||
/public/gazetteer/ @ryantxu
|
/public/gazetteer/ @ryantxu
|
||||||
/public/img/ @grafana/grafana-frontend-platform
|
/public/img/ @grafana/grafana-frontend-platform
|
||||||
/public/lib/ @grafana/grafana-frontend-platform
|
/public/lib/ @grafana/grafana-frontend-platform
|
||||||
|
/public/lib/monaco-languages/kusto.ts @grafana/partner-datasources
|
||||||
/public/maps/ @ryantxu
|
/public/maps/ @ryantxu
|
||||||
/public/robots.txt @grafana/frontend-ops
|
/public/robots.txt @grafana/frontend-ops
|
||||||
/public/sass/ @grafana/grafana-frontend-platform
|
/public/sass/ @grafana/grafana-frontend-platform
|
||||||
@@ -454,25 +458,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-delivery
|
/scripts/ci-* @grafana/grafana-release-guild
|
||||||
/scripts/circle-* @grafana/grafana-delivery
|
/scripts/circle-* @grafana/grafana-release-guild
|
||||||
/scripts/ci-frontend-metrics.sh @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend @grafana/grafana-bi-squad
|
/scripts/ci-frontend-metrics.sh @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend @grafana/grafana-bi-squad
|
||||||
/scripts/cli/ @grafana/grafana-frontend-platform
|
/scripts/cli/ @grafana/grafana-frontend-platform
|
||||||
/scripts/clean-git-or-error.sh @grafana/grafana-as-code
|
/scripts/clean-git-or-error.sh @grafana/grafana-as-code
|
||||||
/scripts/grafana-server/ @grafana/grafana-frontend-platform
|
/scripts/grafana-server/ @grafana/grafana-frontend-platform
|
||||||
/scripts/helpers/ @grafana/grafana-delivery
|
/scripts/helpers/ @grafana/grafana-release-guild
|
||||||
/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-operator-experience-squad
|
/scripts/openapi3/ @grafana/grafana-operator-experience-squad
|
||||||
/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-delivery
|
/scripts/tag_release.sh @grafana/grafana-release-guild
|
||||||
/scripts/trigger_docker_build.sh @grafana/grafana-delivery
|
/scripts/trigger_docker_build.sh @grafana/grafana-release-guild
|
||||||
/scripts/trigger_grafana_packer.sh @grafana/grafana-delivery
|
/scripts/trigger_grafana_packer.sh @grafana/grafana-release-guild
|
||||||
/scripts/trigger_windows_build.sh @grafana/grafana-delivery
|
/scripts/trigger_windows_build.sh @grafana/grafana-release-guild
|
||||||
/scripts/validate-devenv-dashboards.sh @grafana/grafana-delivery
|
/scripts/validate-devenv-dashboards.sh @grafana/grafana-release-guild
|
||||||
/scripts/verify-repo-update/ @grafana/grafana-delivery
|
/scripts/verify-repo-update/ @grafana/grafana-release-guild
|
||||||
|
|
||||||
/scripts/webpack/ @grafana/frontend-ops
|
/scripts/webpack/ @grafana/frontend-ops
|
||||||
/scripts/generate-a11y-report.sh @grafana/grafana-frontend-platform
|
/scripts/generate-a11y-report.sh @grafana/grafana-frontend-platform
|
||||||
@@ -569,9 +573,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-delivery
|
/.github/workflows/auto-milestone.yml @grafana/grafana-release-guild
|
||||||
/.github/workflows/bump-version.yml @grafana/grafana-delivery
|
/.github/workflows/backport.yml @grafana/grafana-release-guild
|
||||||
/.github/workflows/close-milestone.yml @grafana/grafana-delivery
|
/.github/workflows/bump-version.yml @grafana/grafana-release-guild
|
||||||
|
/.github/workflows/close-milestone.yml @grafana/grafana-release-guild
|
||||||
/.github/workflows/cloud-data-sources-code-coverage.yml @grafana/partner-plugins @grafana/aws-datasources
|
/.github/workflows/cloud-data-sources-code-coverage.yml @grafana/partner-plugins @grafana/aws-datasources
|
||||||
/.github/workflows/codeowners-validator.yml @tolzhabayev
|
/.github/workflows/codeowners-validator.yml @tolzhabayev
|
||||||
/.github/workflows/codeql-analysis.yml @DanCech
|
/.github/workflows/codeql-analysis.yml @DanCech
|
||||||
@@ -591,6 +596,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-release-guild
|
||||||
|
/.github/workflows/sync-mirror.yml @grafana/grafana-release-guild
|
||||||
/.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/grafana-frontend-platform
|
/.github/workflows/remove-milestone.yml @grafana/grafana-frontend-platform
|
||||||
@@ -598,9 +605,9 @@ 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/grafana-frontend-platform
|
/.github/workflows/stale.yml @grafana/grafana-frontend-platform
|
||||||
/.github/workflows/update-changelog.yml @grafana/grafana-delivery
|
/.github/workflows/update-changelog.yml @grafana/grafana-release-guild
|
||||||
/.github/workflows/snyk.yml @grafana/security-team
|
/.github/workflows/snyk.yml @grafana/security-team
|
||||||
|
/.github/workflows/create-security-patch-from-security-mirror.yml @grafana/grafana-release-guild
|
||||||
|
|
||||||
# Conf
|
# Conf
|
||||||
/conf/defaults.ini @torkelo
|
/conf/defaults.ini @torkelo
|
||||||
|
|||||||
22
.github/workflows/actions/changelog/action.yml
vendored
Normal file
22
.github/workflows/actions/changelog/action.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: Changelog generator
|
||||||
|
description: Generates and publishes a changelog for the given release version
|
||||||
|
inputs:
|
||||||
|
target:
|
||||||
|
description: Target tag, branch or commit hash for the changelog
|
||||||
|
required: true
|
||||||
|
previous:
|
||||||
|
description: Previous tag, branch or commit hash to start changelog from
|
||||||
|
required: false
|
||||||
|
github_token:
|
||||||
|
description: GitHub token with read/write access to all necessary repositories
|
||||||
|
required: true
|
||||||
|
output_file:
|
||||||
|
description: A file to store resulting changelog markdown
|
||||||
|
required: false
|
||||||
|
outputs:
|
||||||
|
changelog:
|
||||||
|
description: Changelog contents between the two given versions in Markdown format
|
||||||
|
runs:
|
||||||
|
using: 'node20'
|
||||||
|
main: 'index.js'
|
||||||
|
|
||||||
319
.github/workflows/actions/changelog/index.js
vendored
Normal file
319
.github/workflows/actions/changelog/index.js
vendored
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
import { appendFileSync, writeFileSync } from 'fs';
|
||||||
|
import { exec as execCallback } from 'node:child_process';
|
||||||
|
import { promisify } from 'node:util';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Github Action core utils: logging (notice + debug log levels), must escape
|
||||||
|
// newlines and percent signs
|
||||||
|
//
|
||||||
|
const escapeData = (s) => s.replace(/%/g, '%25').replace(/\r/g, '%0D').replace(/\n/g, '%0A');
|
||||||
|
const LOG = (msg) => console.log(`::notice::${escapeData(msg)}`);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Semver utils: parse, compare, sort etc (using official regexp)
|
||||||
|
// https://regex101.com/r/Ly7O1x/3/
|
||||||
|
//
|
||||||
|
const semverRegExp =
|
||||||
|
/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
||||||
|
|
||||||
|
const semverParse = (tag) => {
|
||||||
|
const m = tag.match(semverRegExp);
|
||||||
|
if (!m) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const [_, major, minor, patch, prerelease] = m;
|
||||||
|
return [+major, +minor, +patch, prerelease, tag];
|
||||||
|
};
|
||||||
|
|
||||||
|
// semverCompare takes two parsed semver tags and comparest them more or less
|
||||||
|
// according to the semver specs
|
||||||
|
const semverCompare = (a, b) => {
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
if (a[i] !== b[i]) {
|
||||||
|
return a[i] < b[i] ? 1 : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (a[3] !== b[3]) {
|
||||||
|
return a[3] < b[3] ? 1 : -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Using `git tag -l` output find the tag (version) that goes semantically
|
||||||
|
// right before the given version. This might not work correctly with some
|
||||||
|
// pre-release versions, which is why it's possible to pass previous version
|
||||||
|
// into this action explicitly to avoid this step.
|
||||||
|
const getPreviousVersion = async (version) => {
|
||||||
|
const exec = promisify(execCallback);
|
||||||
|
const { stdout } = await exec('git tag -l');
|
||||||
|
const prev = stdout
|
||||||
|
.split('\n')
|
||||||
|
.map(semverParse)
|
||||||
|
.filter((tag) => tag)
|
||||||
|
.sort(semverCompare)
|
||||||
|
.find((tag) => semverCompare(tag, semverParse(version)) > 0);
|
||||||
|
if (!prev) {
|
||||||
|
throw `Could not find previous git tag for ${version}`;
|
||||||
|
}
|
||||||
|
return prev[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
// A helper for Github GraphQL API endpoint
|
||||||
|
const graphql = async (ghtoken, query, variables) => {
|
||||||
|
const { env } = process;
|
||||||
|
const results = await fetch('https://api.github.com/graphql', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
Authorization: `Bearer ${ghtoken}`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ query, variables }),
|
||||||
|
});
|
||||||
|
const { data } = await results.json();
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Using Github GraphQL API find the timestamp for the given tag/commit hash.
|
||||||
|
// This is required for PR listing, because Github API only takes date/time as
|
||||||
|
// a "since" parameter while listing. Currently there is no way to provide two
|
||||||
|
// "commitish" items and get a list of PRs in between them.
|
||||||
|
const getCommitishDate = async (name, owner, target) => {
|
||||||
|
const result = await graphql(
|
||||||
|
ghtoken,
|
||||||
|
`
|
||||||
|
query getCommitDate($owner: String!, $name: String!, $target: String!) {
|
||||||
|
repository(owner: $owner, name: $name) {
|
||||||
|
object(expression: $target) {
|
||||||
|
... on Commit {
|
||||||
|
committedDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ name, owner, target }
|
||||||
|
);
|
||||||
|
return result.repository.object.committedDate;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Using Github GraphQL API get a list of PRs between the two "commitish" items.
|
||||||
|
// This resoves the "since" item's timestamp first and iterates over all PRs
|
||||||
|
// till "target" using naïve pagination.
|
||||||
|
const getHistory = async (name, owner, target, sinceDate) => {
|
||||||
|
LOG(`Fetching ${owner}/${name} PRs since ${sinceDate} till ${target}`);
|
||||||
|
const query = `
|
||||||
|
query findCommitsWithAssociatedPullRequests(
|
||||||
|
$name: String!
|
||||||
|
$owner: String!
|
||||||
|
$target: String!
|
||||||
|
$sinceDate: GitTimestamp
|
||||||
|
$cursor: String
|
||||||
|
) {
|
||||||
|
repository(name: $name, owner: $owner) {
|
||||||
|
object(expression: $target) {
|
||||||
|
... on Commit {
|
||||||
|
history(first: 50, since: $sinceDate, after: $cursor) {
|
||||||
|
totalCount
|
||||||
|
pageInfo {
|
||||||
|
hasNextPage
|
||||||
|
endCursor
|
||||||
|
}
|
||||||
|
nodes {
|
||||||
|
id
|
||||||
|
associatedPullRequests(first: 1) {
|
||||||
|
nodes {
|
||||||
|
title
|
||||||
|
number
|
||||||
|
labels(first: 10) {
|
||||||
|
nodes {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
commits(first: 1) {
|
||||||
|
nodes {
|
||||||
|
commit {
|
||||||
|
author {
|
||||||
|
user {
|
||||||
|
login
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`;
|
||||||
|
|
||||||
|
let cursor;
|
||||||
|
let nodes = [];
|
||||||
|
for (;;) {
|
||||||
|
const result = await graphql(ghtoken, query, {
|
||||||
|
name,
|
||||||
|
owner,
|
||||||
|
target,
|
||||||
|
sinceDate,
|
||||||
|
cursor,
|
||||||
|
});
|
||||||
|
LOG(`GraphQL: ${JSON.stringify(result)}`);
|
||||||
|
nodes = [...nodes, ...result.repository.object.history.nodes];
|
||||||
|
const { hasNextPage, endCursor } = result.repository.object.history.pageInfo;
|
||||||
|
if (!hasNextPage) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cursor = endCursor;
|
||||||
|
}
|
||||||
|
return nodes;
|
||||||
|
};
|
||||||
|
|
||||||
|
// The main function for this action: given two "commitish" items it gets a
|
||||||
|
// list of PRs between them and filters/groups the PRs by category (bugfix,
|
||||||
|
// feature, deprecation, breaking change and plugin fixes/enhancements).
|
||||||
|
//
|
||||||
|
// PR grouping relies on Github labels only, not on the PR contents.
|
||||||
|
const getChangeLogItems = async (name, owner, sinceDate, to) => {
|
||||||
|
// check if a node contains a certain label
|
||||||
|
const hasLabel = ({ labels }, label) => labels.nodes.some(({ name }) => name === label);
|
||||||
|
// get all the PRs between the two "commitish" items
|
||||||
|
const history = await getHistory(name, owner, to, sinceDate);
|
||||||
|
|
||||||
|
const items = history.flatMap((node) => {
|
||||||
|
// discard PRs without a "changelog" label
|
||||||
|
const changes = node.associatedPullRequests.nodes.filter((PR) => hasLabel(PR, 'add to changelog'));
|
||||||
|
if (changes.length === 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const item = changes[0];
|
||||||
|
const { number, url, labels } = item;
|
||||||
|
const title = item.title.replace(/^\[[^\]]+\]:?\s*/, '');
|
||||||
|
// for changelog PRs try to find a suitable category.
|
||||||
|
// Note that we can not detect "deprecation notices" like that
|
||||||
|
// as there is no suitable label yet.
|
||||||
|
const isBug = /fix/i.test(title) || hasLabel({ labels }, 'type/bug');
|
||||||
|
const isBreaking = hasLabel({ labels }, 'breaking change');
|
||||||
|
const isPlugin =
|
||||||
|
hasLabel({ labels }, 'area/grafana/ui') ||
|
||||||
|
hasLabel({ labels }, 'area/grafana/toolkit') ||
|
||||||
|
hasLabel({ labels }, 'area/grafana/runtime');
|
||||||
|
const author = item.commits.nodes[0].commit.author.user.login;
|
||||||
|
return {
|
||||||
|
repo: name,
|
||||||
|
number,
|
||||||
|
title,
|
||||||
|
author,
|
||||||
|
isBug,
|
||||||
|
isPlugin,
|
||||||
|
isBreaking,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return items;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ======================================================
|
||||||
|
// GENERATE CHANGELOG
|
||||||
|
// ======================================================
|
||||||
|
|
||||||
|
LOG(`Changelog action started`);
|
||||||
|
|
||||||
|
const ghtoken = process.env.GITHUB_TOKEN || process.env.INPUT_GITHUB_TOKEN;
|
||||||
|
if (!ghtoken) {
|
||||||
|
throw 'GITHUB_TOKEN is not set and "github_token" input is empty';
|
||||||
|
}
|
||||||
|
|
||||||
|
const target = process.argv[2] || process.env.INPUT_TARGET;
|
||||||
|
LOG(`Target tag/branch/commit: ${target}`);
|
||||||
|
|
||||||
|
const previous = process.argv[3] || process.env.INPUT_PREVIOUS || (await getPreviousVersion(target));
|
||||||
|
|
||||||
|
LOG(`Previous tag/commit: ${previous}`);
|
||||||
|
|
||||||
|
const sinceDate = await getCommitishDate('grafana', 'grafana', previous);
|
||||||
|
LOG(`Previous tag/commit timestamp: ${sinceDate}`);
|
||||||
|
|
||||||
|
// Get all changelog items from Grafana OSS
|
||||||
|
const oss = await getChangeLogItems('grafana', 'grafana', sinceDate, target);
|
||||||
|
// Get all changelog items from Grafana Enterprise
|
||||||
|
const entr = await getChangeLogItems('grafana-enterprise', 'grafana', sinceDate, target);
|
||||||
|
|
||||||
|
LOG(`Found OSS PRs: ${oss.length}`);
|
||||||
|
LOG(`Found Enterprise PRs: ${entr.length}`);
|
||||||
|
|
||||||
|
// Sort PRs and categorise them into sections
|
||||||
|
const changelog = [...oss, ...entr]
|
||||||
|
.sort((a, b) => (a.title < b.title ? -1 : 1))
|
||||||
|
.reduce(
|
||||||
|
(changelog, item) => {
|
||||||
|
if (item.isPlugin) {
|
||||||
|
changelog.plugins.push(item);
|
||||||
|
} else if (item.isBug) {
|
||||||
|
changelog.bugfixes.push(item);
|
||||||
|
} else if (item.isBreaking) {
|
||||||
|
changelog.breaking.push(item);
|
||||||
|
} else {
|
||||||
|
changelog.features.push(item);
|
||||||
|
}
|
||||||
|
return changelog;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
breaking: [],
|
||||||
|
plugins: [],
|
||||||
|
bugfixes: [],
|
||||||
|
features: [],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Convert PR numbers to Github links
|
||||||
|
const pullRequestLink = (n) => `[#${n}](https://github.com/grafana/grafana/pull/${n})`;
|
||||||
|
// Convert Github user IDs to Github links
|
||||||
|
const userLink = (u) => `[@${u}](https://github.com/${u})`;
|
||||||
|
|
||||||
|
// Now that we have a changelog - we can render some markdown as an output
|
||||||
|
const markdown = (changelog) => {
|
||||||
|
// This convers a list of changelog items into a markdown section with a list of titles/links
|
||||||
|
const section = (title, items) =>
|
||||||
|
items.length === 0
|
||||||
|
? ''
|
||||||
|
: `### ${title}
|
||||||
|
|
||||||
|
${items
|
||||||
|
.map(
|
||||||
|
(item) =>
|
||||||
|
`- ${item.title.replace(/^([^:]*:)/gm, '**$1**')} ${
|
||||||
|
item.repo === 'grafana-enterprise'
|
||||||
|
? '(Enterprise)'
|
||||||
|
: `${pullRequestLink(item.number)}, ${userLink(item.author)}`
|
||||||
|
}`
|
||||||
|
)
|
||||||
|
.join('\n')}
|
||||||
|
`;
|
||||||
|
|
||||||
|
// Render all present sections for the given changelog
|
||||||
|
return `${section('Features and enhancements', changelog.features)}
|
||||||
|
${section('Bug fixes', changelog.bugfixes)}
|
||||||
|
${section('Breaking changes', changelog.breaking)}
|
||||||
|
${section('Plugin development fixes & changes', changelog.plugins)}
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const md = markdown(changelog);
|
||||||
|
|
||||||
|
// Print changelog, mostly for debugging
|
||||||
|
LOG(`Resulting markdown: ${md}`);
|
||||||
|
|
||||||
|
// Save changelog as an output for this action
|
||||||
|
if (process.env.GITHUB_OUTPUT) {
|
||||||
|
LOG(`Output to ${process.env.GITHUB_OUTPUT}`);
|
||||||
|
appendFileSync(process.env.GITHUB_OUTPUT, `changelog<<EOF\n${escapeData(md)}\nEOF`);
|
||||||
|
} else {
|
||||||
|
LOG('GITHUB_OUTPUT is not set');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save changelog as an output file (if requested)
|
||||||
|
if (process.env.INPUT_OUTPUT_FILE) {
|
||||||
|
LOG(`Output to ${process.env.INPUT_OUTPUT_FILE}`);
|
||||||
|
writeFileSync(process.env.INPUT_OUTPUT_FILE, md);
|
||||||
|
}
|
||||||
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 }}
|
||||||
|
|||||||
129
.github/workflows/changelog.yml
vendored
Normal file
129
.github/workflows/changelog.yml
vendored
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
name: Generate changelog
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
description: 'Target release version (semver, git tag, branch or commit)'
|
||||||
|
target:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
description: 'The base branch that these changes are being merged into'
|
||||||
|
dry_run:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
latest:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
secrets:
|
||||||
|
GRAFANA_DELIVERY_BOT_APP_ID:
|
||||||
|
required: true
|
||||||
|
GRAFANA_DELIVERY_BOT_APP_PEM:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
description: 'Target release version (semver, git tag, branch or commit)'
|
||||||
|
target:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
description: 'The base branch that these changes are being merged into'
|
||||||
|
dry_run:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
latest:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
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 Grafana repo"
|
||||||
|
uses: "actions/checkout@v4"
|
||||||
|
with:
|
||||||
|
sparse-checkout: |
|
||||||
|
.github/workflows
|
||||||
|
CHANGELOG.md
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
- name: "Configure git user"
|
||||||
|
run: |
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local --add --bool push.autoSetupRemote true
|
||||||
|
- name: "Create branch"
|
||||||
|
run: git checkout -b "changelog/${{ github.run_id }}/${{ inputs.version }}"
|
||||||
|
- name: "Generate changelog"
|
||||||
|
id: changelog
|
||||||
|
uses: ./.github/workflows/actions/changelog
|
||||||
|
with:
|
||||||
|
github_token: ${{ steps.generate_token.outputs.token }}
|
||||||
|
target: v${{ inputs.version }}
|
||||||
|
output_file: changelog_items.md
|
||||||
|
- name: "Patch CHANGELOG.md"
|
||||||
|
run: |
|
||||||
|
# Prepare CHANGELOG.md content with version delimiters
|
||||||
|
(
|
||||||
|
echo
|
||||||
|
echo "# ${{ inputs.version}} ($(date '+%F'))"
|
||||||
|
echo
|
||||||
|
cat changelog_items.md
|
||||||
|
) > CHANGELOG.part
|
||||||
|
|
||||||
|
# Check if a version exists in the changelog
|
||||||
|
if grep -q "<!-- ${{ inputs.version}} START" CHANGELOG.md ; then
|
||||||
|
# Replace the content between START and END delimiters
|
||||||
|
echo "Version ${{ inputs.version }} is found in the CHANGELOG.md, patching contents..."
|
||||||
|
sed -i -e '/${{ inputs.version }} START/,/${{ inputs.version }} END/{//!d;}' \
|
||||||
|
-e '/${{ inputs.version }} START/r CHANGELOG.part' CHANGELOG.md
|
||||||
|
else
|
||||||
|
# Prepend changelog part to the main changelog file
|
||||||
|
echo "Version ${{ inputs.version }} not found in the CHANGELOG.md"
|
||||||
|
(
|
||||||
|
echo "<!-- ${{ inputs.version }} START -->"
|
||||||
|
cat CHANGELOG.part
|
||||||
|
echo "<!-- ${{ inputs.version }} END -->"
|
||||||
|
cat CHANGELOG.md
|
||||||
|
) > CHANGELOG.tmp
|
||||||
|
mv CHANGELOG.tmp CHANGELOG.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
git diff CHANGELOG.md
|
||||||
|
git add CHANGELOG.md
|
||||||
|
- name: "Commit changelog changes"
|
||||||
|
run: git commit --allow-empty -m "Update changelog" CHANGELOG.md
|
||||||
|
- name: "git push"
|
||||||
|
if: ${{ inputs.dry_run }} != true
|
||||||
|
run: git push
|
||||||
|
- name: "Create changelog PR"
|
||||||
|
run: >
|
||||||
|
gh pr create \
|
||||||
|
--dry-run=${{ inputs.dry_run }} \
|
||||||
|
--label "no-backport" \
|
||||||
|
--label "no-changelog" \
|
||||||
|
-B "${{ inputs.target }}" \
|
||||||
|
--title "Release: ${{ inputs.version }}" \
|
||||||
|
--body "Changelog changes for release ${{ inputs.version }}"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||||
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 }}
|
||||||
|
|||||||
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.21.10'
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
|
|||||||
46
.github/workflows/community-release.yml
vendored
Normal file
46
.github/workflows/community-release.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: Create community release post
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview<number> format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1'
|
||||||
|
dry_run:
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
description: When enabled, this workflow will print a preview instead of creating an actual post.
|
||||||
|
secrets:
|
||||||
|
GRAFANA_MISC_STATS_API_KEY:
|
||||||
|
required: true
|
||||||
|
GRAFANABOT_FORUM_KEY:
|
||||||
|
required: true
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview<number> format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1'
|
||||||
|
dry_run:
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
description: When enabled, this workflow will print a preview instead of creating an actual post.
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Run community-release (manually invoked)
|
||||||
|
uses: grafana/grafana-github-actions-go/community-release@main
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
version: ${{ inputs.version }}
|
||||||
|
metrics_api_key: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||||
|
community_api_key: ${{ secrets.GRAFANABOT_FORUM_KEY }}
|
||||||
|
community_api_username: grafanabot
|
||||||
|
dry_run: ${{ inputs.dry_run }}
|
||||||
28
.github/workflows/create-security-patch-from-security-mirror.yml
vendored
Normal file
28
.github/workflows/create-security-patch-from-security-mirror.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Owned by grafana-release-guild
|
||||||
|
# Intended to be dropped into the base repo (Ex: grafana/grafana) for use in the security mirror.
|
||||||
|
name: Create security patch
|
||||||
|
run-name: create-security-patch
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- reopened
|
||||||
|
- synchronize
|
||||||
|
branches:
|
||||||
|
- "main"
|
||||||
|
- "v*.*.*"
|
||||||
|
|
||||||
|
# This is run before the pull request has been merged, so we'll run against the src branch
|
||||||
|
jobs:
|
||||||
|
trigger_downstream_create_security_patch:
|
||||||
|
concurrency: create-patch-${{ github.ref_name }}
|
||||||
|
uses: grafana/security-patch-actions/.github/workflows/create-patch.yml@main
|
||||||
|
if: github.repository == 'grafana/grafana-security-mirror'
|
||||||
|
with:
|
||||||
|
repo: "${{ github.repository }}"
|
||||||
|
src_ref: "${{ github.head_ref }}" # this is the source branch name, Ex: "feature/newthing"
|
||||||
|
patch_ref: "${{ github.base_ref }}" # this is the target branch name, Ex: "main"
|
||||||
|
patch_repo: "grafana/grafana-security-patches"
|
||||||
|
patch_prefix: "${{ github.event.pull_request.number }}"
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
48
.github/workflows/github-release.yml
vendored
48
.github/workflows/github-release.yml
vendored
@@ -1,24 +1,48 @@
|
|||||||
name: Create or update GitHub release
|
name: Create or update GitHub release
|
||||||
on:
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
description: Needs to match, exactly, the name of a milestone (NO v prefix)
|
||||||
|
type: string
|
||||||
|
latest:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
description: Mark this release as latest (`1`) or not (`0`, default)
|
||||||
|
type: string
|
||||||
|
dry_run:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
required: true
|
required: true
|
||||||
description: Needs to match, exactly, the name of a milestone (NO v prefix)
|
description: Needs to match, exactly, the name of a milestone (NO v prefix)
|
||||||
|
type: string
|
||||||
|
latest:
|
||||||
|
required: false
|
||||||
|
description: Mark this release as latest (`1`) or not (`0`, default)
|
||||||
|
type: string
|
||||||
|
dry_run:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
# contents: write allows the action(s) to create github releases
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Actions
|
- name: Create GitHub release (manually invoked)
|
||||||
uses: actions/checkout@v3
|
uses: grafana/grafana-github-actions-go/github-release@main
|
||||||
with:
|
with:
|
||||||
repository: "grafana/grafana-github-actions"
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
path: ./actions
|
version: ${{ inputs.version }}
|
||||||
ref: main
|
metrics_api_key: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||||
- name: Install Actions
|
latest: ${{ inputs.latest }}
|
||||||
run: npm install --production --prefix ./actions
|
dry_run: ${{ inputs.dry_run }}
|
||||||
- name: Run github release action
|
|
||||||
uses: ./actions/github-release
|
|
||||||
with:
|
|
||||||
token: ${{secrets.GH_BOT_ACCESS_TOKEN}}
|
|
||||||
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/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.21.10'
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
|
|||||||
28
.github/workflows/pr-commands.yml
vendored
28
.github/workflows/pr-commands.yml
vendored
@@ -8,20 +8,44 @@ on:
|
|||||||
concurrency:
|
concurrency:
|
||||||
group: pr-commands-${{ github.event.number }}
|
group: pr-commands-${{ github.event.number }}
|
||||||
jobs:
|
jobs:
|
||||||
|
config:
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
outputs:
|
||||||
|
has-secrets: ${{ steps.check.outputs.has-secrets }}
|
||||||
|
steps:
|
||||||
|
- name: "Check for secrets"
|
||||||
|
id: check
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ -n "${{ (secrets.GRAFANA_PR_AUTOMATION_APP_ID != '' &&
|
||||||
|
secrets.GRAFANA_PR_AUTOMATION_APP_PEM != '' &&
|
||||||
|
secrets.GRAFANA_MISC_STATS_API_KEY != ''
|
||||||
|
) || '' }}" ]; then
|
||||||
|
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
main:
|
main:
|
||||||
|
needs: config
|
||||||
|
if: needs.config.outputs.has-secrets
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Actions
|
- name: Checkout Actions
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: "grafana/grafana-github-actions"
|
repository: "grafana/grafana-github-actions"
|
||||||
path: ./actions
|
path: ./actions
|
||||||
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_PR_AUTOMATION_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_PEM }}
|
||||||
- name: Run Commands
|
- name: Run Commands
|
||||||
uses: ./actions/commands
|
uses: ./actions/commands
|
||||||
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 }}
|
||||||
configPath: pr-commands
|
configPath: pr-commands
|
||||||
|
|||||||
27
.github/workflows/pr-patch-check.yml
vendored
Normal file
27
.github/workflows/pr-patch-check.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Owned by grafana-release-guild
|
||||||
|
# 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:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- reopened
|
||||||
|
- synchronize
|
||||||
|
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
|
||||||
|
if: github.repository == 'grafana/grafana'
|
||||||
|
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
|
||||||
78
.github/workflows/release-comms.yml
vendored
Normal file
78
.github/workflows/release-comms.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# This workflow runs whenever the release PR is merged. It includes post-release communication processes like
|
||||||
|
# posting to slack, the website, community forums, etc.
|
||||||
|
# Only things that happen after a release is completed and all of the necessary code changes (like the changelog) are made.
|
||||||
|
name: Post-release
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
latest:
|
||||||
|
type: bool
|
||||||
|
default: false
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
- 'v*.*.*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
setup:
|
||||||
|
if: ${{ github.event_name == 'workflow_dispatch' || (github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/')) }}
|
||||||
|
name: Setup and establish latest
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.output.outputs.version }}
|
||||||
|
dry_run: ${{ steps.output.outputs.dry_run }}
|
||||||
|
latest: ${{ steps.output.outputs.latest }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- if: ${{ github.event_name == 'workflow_dispatch' }}
|
||||||
|
run: |
|
||||||
|
echo setting up GITHUB_ENV for ${{ github.event_name }}
|
||||||
|
echo "VERSION=${{ inputs.version }}" >> $GITHUB_ENV
|
||||||
|
echo "DRY_RUN=${{ inputs.dry_run }}" >> $GITHUB_ENV
|
||||||
|
echo "LATEST=${{ inputs.latest }}" >> $GITHUB_ENV
|
||||||
|
- if: ${{ github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/') }}
|
||||||
|
run: |
|
||||||
|
echo "VERSION=$(echo ${{ github.head_ref }} | sed -e 's/release\/.*\///g')" >> $GITHUB_ENV
|
||||||
|
echo "DRY_RUN=${{ contains(github.event.pull_request.labels.*.name, 'release/dry-run') }}" >> $GITHUB_ENV
|
||||||
|
echo "LATEST=${{ contains(github.event.pull_request.labels.*.name, 'release/latest') }}" >> $GITHUB_ENV
|
||||||
|
- id: output
|
||||||
|
run: |
|
||||||
|
echo "dry_run: $DRY_RUN"
|
||||||
|
echo "latest: $LATEST"
|
||||||
|
echo "version: $VERSION"
|
||||||
|
|
||||||
|
echo "dry_run=$DRY_RUN" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "latest=$LATEST" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
||||||
|
post_changelog_on_forum:
|
||||||
|
needs: setup
|
||||||
|
uses: ./.github/workflows/community-release.yml
|
||||||
|
secrets:
|
||||||
|
GRAFANA_MISC_STATS_API_KEY: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||||
|
GRAFANABOT_FORUM_KEY: ${{ secrets.GRAFANABOT_FORUM_KEY }}
|
||||||
|
with:
|
||||||
|
version: ${{ needs.setup.outputs.version }}
|
||||||
|
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
|
||||||
|
create_github_release:
|
||||||
|
# a github release requires a git tag
|
||||||
|
# The github-release action retrieves the changelog using the /repos/grafana/grafana/contents/CHANGELOG.md API
|
||||||
|
# endpoint.
|
||||||
|
needs: setup
|
||||||
|
uses: ./.github/workflows/github-release.yml
|
||||||
|
with:
|
||||||
|
version: ${{ needs.setup.outputs.version }}
|
||||||
|
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
|
||||||
|
latest: ${{ needs.setup.outputs.latest }}
|
||||||
|
post_on_slack:
|
||||||
|
needs: setup
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- run: |
|
||||||
|
echo announce on slack that ${{ needs.setup.outputs.version }} has been released
|
||||||
|
echo dry run: ${{ needs.setup.outputs.dry_run }}
|
||||||
154
.github/workflows/release-pr.yml
vendored
Normal file
154
.github/workflows/release-pr.yml
vendored
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
# This workflow creates a new PR in Grafana which is triggered after a release is completed.
|
||||||
|
# It should include all code changes that are needed after a release is done. This includes the changelog update and
|
||||||
|
# version bumps, but could include more in the future.
|
||||||
|
# Please refrain from including any processes that do not result in code changes in this workflow. Instead, they should
|
||||||
|
# either be triggered in the release promotion process or in the release comms process (that is triggered by merging
|
||||||
|
# this PR).
|
||||||
|
name: Complete a Grafana release
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
description: The version of Grafana that is being released
|
||||||
|
target:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
description: The base branch that these changes are being merged into
|
||||||
|
backport:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
description: Branch to backport these changes to
|
||||||
|
dry_run:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
latest:
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
push-changelog-to-main:
|
||||||
|
name: Create PR to main to update the changelog
|
||||||
|
uses: ./.github/workflows/changelog.yml
|
||||||
|
with:
|
||||||
|
version: ${{ inputs.version }}
|
||||||
|
latest: ${{ inputs.latest }}
|
||||||
|
dry_run: ${{ inputs.dry_run }}
|
||||||
|
target: main
|
||||||
|
secrets:
|
||||||
|
GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
|
create-prs:
|
||||||
|
name: Create Release PR
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.repository == 'grafana/grafana'
|
||||||
|
steps:
|
||||||
|
- name: Generate bot 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 Grafana
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
|
||||||
|
- name: Configure git user
|
||||||
|
run: |
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local --add --bool push.autoSetupRemote true
|
||||||
|
|
||||||
|
- name: Create branch
|
||||||
|
run: git checkout -b "release/${{ github.run_id }}/${{ inputs.version }}"
|
||||||
|
|
||||||
|
- name: Generate changelog
|
||||||
|
id: changelog
|
||||||
|
uses: ./.github/workflows/actions/changelog
|
||||||
|
with:
|
||||||
|
github_token: ${{ steps.generate_token.outputs.token }}
|
||||||
|
target: v${{ inputs.version }}
|
||||||
|
output_file: changelog_items.md
|
||||||
|
|
||||||
|
- name: Patch CHANGELOG.md
|
||||||
|
run: |
|
||||||
|
# Prepare CHANGELOG.md content with version delimiters
|
||||||
|
(
|
||||||
|
echo
|
||||||
|
echo "# ${{ inputs.version}} ($(date '+%F'))"
|
||||||
|
echo
|
||||||
|
cat changelog_items.md
|
||||||
|
) > CHANGELOG.part
|
||||||
|
|
||||||
|
# Check if a version exists in the changelog
|
||||||
|
if grep -q "<!-- ${{ inputs.version}} START" CHANGELOG.md ; then
|
||||||
|
# Replace the content between START and END delimiters
|
||||||
|
echo "Version ${{ inputs.version }} is found in the CHANGELOG.md, patching contents..."
|
||||||
|
sed -i -e '/${{ inputs.version }} START/,/${{ inputs.version }} END/{//!d;}' \
|
||||||
|
-e '/${{ inputs.version }} START/r CHANGELOG.part' CHANGELOG.md
|
||||||
|
else
|
||||||
|
# Prepend changelog part to the main changelog file
|
||||||
|
echo "Version ${{ inputs.version }} not found in the CHANGELOG.md"
|
||||||
|
(
|
||||||
|
echo "<!-- ${{ inputs.version }} START -->"
|
||||||
|
cat CHANGELOG.part
|
||||||
|
echo "<!-- ${{ inputs.version }} END -->"
|
||||||
|
cat CHANGELOG.md
|
||||||
|
) > CHANGELOG.tmp
|
||||||
|
mv CHANGELOG.tmp CHANGELOG.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f CHANGELOG.part changelog_items.md
|
||||||
|
|
||||||
|
git diff CHANGELOG.md
|
||||||
|
|
||||||
|
- name: Commit CHANGELOG.md changes
|
||||||
|
run: git commit --allow-empty -m "Update changelog placeholder" CHANGELOG.md
|
||||||
|
|
||||||
|
- name: Update package.json versions
|
||||||
|
uses: ./pkg/build/actions/bump-version
|
||||||
|
with:
|
||||||
|
version: ${{ inputs.version }}
|
||||||
|
|
||||||
|
- name: Add package.json changes
|
||||||
|
run: |
|
||||||
|
git add .
|
||||||
|
git commit -m "Update version to ${{ inputs.version }}"
|
||||||
|
|
||||||
|
- name: Git push
|
||||||
|
if: ${{ inputs.dry_run }} != true
|
||||||
|
run: git push --set-upstream origin release/${{ github.run_id }}/${{ inputs.version }}
|
||||||
|
|
||||||
|
- name: Create PR without backports
|
||||||
|
if: "${{ inputs.backport == '' }}"
|
||||||
|
run: >
|
||||||
|
gh pr create \
|
||||||
|
$( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \
|
||||||
|
--dry-run=${{ inputs.dry_run }} \
|
||||||
|
-B "${{ inputs.target }}" \
|
||||||
|
--title "Release: ${{ inputs.version }}" \
|
||||||
|
--body "These code changes must be merged after a release is complete"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Create PR with backports
|
||||||
|
if: "${{ inputs.backport != '' }}"
|
||||||
|
run: >
|
||||||
|
gh pr create \
|
||||||
|
$( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \
|
||||||
|
-l "product-approved" \
|
||||||
|
--dry-run=${{ inputs.dry_run }} \
|
||||||
|
-B "${{ inputs.target }}" \
|
||||||
|
--title "Release: ${{ inputs.version }}" \
|
||||||
|
--body "These code changes must be merged after a release is complete"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
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-release-guild
|
||||||
|
# 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
|
||||||
|
|
||||||
12
.github/workflows/update-changelog.yml
vendored
12
.github/workflows/update-changelog.yml
vendored
@@ -17,9 +17,15 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
- name: Install Actions
|
- name: Install Actions
|
||||||
run: npm install --production --prefix ./actions
|
run: npm install --production --prefix ./actions
|
||||||
- name: Run update changelog (manually invoked)
|
- name: "Generate token"
|
||||||
uses: ./actions/update-changelog
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GH_BOT_ACCESS_TOKEN }}
|
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||||
|
- name: Run update changelog (manually invoked)
|
||||||
|
uses: grafana/grafana-github-actions-go/update-changelog@main
|
||||||
|
with:
|
||||||
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||||
grafanabotForumKey: ${{ secrets.GRAFANABOT_FORUM_KEY }}
|
grafanabotForumKey: ${{ secrets.GRAFANABOT_FORUM_KEY }}
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -191,3 +191,6 @@ public/api-spec.json
|
|||||||
deployment_tools_config.json
|
deployment_tools_config.json
|
||||||
|
|
||||||
.betterer.cache
|
.betterer.cache
|
||||||
|
|
||||||
|
# Temporary file for backporting PRs
|
||||||
|
.pr-body.txt
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ rules = "pkg/ruleguard.rules.go"
|
|||||||
disable-all = true
|
disable-all = true
|
||||||
enable = [
|
enable = [
|
||||||
"bodyclose",
|
"bodyclose",
|
||||||
"depguard",
|
|
||||||
"dogsled",
|
"dogsled",
|
||||||
"errcheck",
|
"errcheck",
|
||||||
# "gochecknoinits",
|
# "gochecknoinits",
|
||||||
@@ -46,7 +45,6 @@ enable = [
|
|||||||
"govet",
|
"govet",
|
||||||
"ineffassign",
|
"ineffassign",
|
||||||
"misspell",
|
"misspell",
|
||||||
"nakedret",
|
|
||||||
"rowserrcheck",
|
"rowserrcheck",
|
||||||
"exportloopref",
|
"exportloopref",
|
||||||
"staticcheck",
|
"staticcheck",
|
||||||
@@ -88,6 +86,10 @@ text = "ST1001"
|
|||||||
linters = ["staticcheck"]
|
linters = ["staticcheck"]
|
||||||
text = "SA1019: strings.Title"
|
text = "SA1019: strings.Title"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["staticcheck"]
|
||||||
|
text = "SA1019: grpc.Dial"
|
||||||
|
|
||||||
[[issues.exclude-rules]]
|
[[issues.exclude-rules]]
|
||||||
linters = ["staticcheck"]
|
linters = ["staticcheck"]
|
||||||
text = "use fake service and real access control evaluator instead"
|
text = "use fake service and real access control evaluator instead"
|
||||||
@@ -150,3 +152,36 @@ text = "ST1020"
|
|||||||
[[issues.exclude-rules]]
|
[[issues.exclude-rules]]
|
||||||
linters = ["stylecheck"]
|
linters = ["stylecheck"]
|
||||||
text = "ST1021"
|
text = "ST1021"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["staticcheck"]
|
||||||
|
text = "SA1019"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["staticcheck"]
|
||||||
|
text = "SA1019"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["misspell"]
|
||||||
|
text = "`Creater` is a misspelling of `Creature`"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["gosec"]
|
||||||
|
text = "G103"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["gosec"]
|
||||||
|
text = "G303"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["gosec"]
|
||||||
|
text = "G301"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["gosec"]
|
||||||
|
text = "G101"
|
||||||
|
|
||||||
|
[[issues.exclude-rules]]
|
||||||
|
linters = ["errcheck"]
|
||||||
|
text = "fmt.Fprint"
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ var config = {
|
|||||||
{
|
{
|
||||||
url: '${HOST}/?orgId=1',
|
url: '${HOST}/?orgId=1',
|
||||||
wait: 500,
|
wait: 500,
|
||||||
threshold: 0,
|
threshold: 3,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge',
|
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge',
|
||||||
@@ -93,7 +93,7 @@ var config = {
|
|||||||
url: '${HOST}/?orgId=1&search=open',
|
url: '${HOST}/?orgId=1&search=open',
|
||||||
wait: 500,
|
wait: 500,
|
||||||
rootElement: '.main-view',
|
rootElement: '.main-view',
|
||||||
threshold: 0,
|
threshold: 3,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
url: '${HOST}/alerting/list',
|
url: '${HOST}/alerting/list',
|
||||||
|
|||||||
9974
CHANGELOG.md
9974
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
16
Dockerfile
16
Dockerfile
@@ -1,9 +1,9 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG BASE_IMAGE=alpine:3.17
|
ARG BASE_IMAGE=alpine:3.19.1
|
||||||
ARG JS_IMAGE=node:18-alpine3.17
|
ARG JS_IMAGE=node:18-alpine
|
||||||
ARG JS_PLATFORM=linux/amd64
|
ARG JS_PLATFORM=linux/amd64
|
||||||
ARG GO_IMAGE=golang:1.20.1-alpine3.17
|
ARG GO_IMAGE=golang:1.21.10-alpine
|
||||||
|
|
||||||
ARG GO_SRC=go-builder
|
ARG GO_SRC=go-builder
|
||||||
ARG JS_SRC=js-builder
|
ARG JS_SRC=js-builder
|
||||||
@@ -31,6 +31,8 @@ RUN yarn build
|
|||||||
|
|
||||||
FROM ${GO_IMAGE} as go-builder
|
FROM ${GO_IMAGE} as go-builder
|
||||||
|
|
||||||
|
ARG COMMIT_SHA=""
|
||||||
|
ARG BUILD_BRANCH=""
|
||||||
ARG GO_BUILD_TAGS="oss"
|
ARG GO_BUILD_TAGS="oss"
|
||||||
ARG WIRE_TAGS="oss"
|
ARG WIRE_TAGS="oss"
|
||||||
ARG BINGO="true"
|
ARG BINGO="true"
|
||||||
@@ -62,7 +64,10 @@ COPY pkg pkg
|
|||||||
COPY scripts scripts
|
COPY scripts scripts
|
||||||
COPY conf conf
|
COPY conf conf
|
||||||
COPY .github .github
|
COPY .github .github
|
||||||
COPY .git .git
|
COPY LICENSE ./
|
||||||
|
|
||||||
|
ENV COMMIT_SHA=${COMMIT_SHA}
|
||||||
|
ENV BUILD_BRANCH=${BUILD_BRANCH}
|
||||||
|
|
||||||
RUN make build-go GO_BUILD_TAGS=${GO_BUILD_TAGS} WIRE_TAGS=${WIRE_TAGS}
|
RUN make build-go GO_BUILD_TAGS=${GO_BUILD_TAGS} WIRE_TAGS=${WIRE_TAGS}
|
||||||
|
|
||||||
@@ -106,7 +111,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 \
|
||||||
@@ -161,6 +166,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
|
||||||
|
|
||||||
|
|||||||
97
Makefile
97
Makefile
@@ -13,11 +13,12 @@ GO = go
|
|||||||
GO_FILES ?= ./pkg/...
|
GO_FILES ?= ./pkg/...
|
||||||
SH_FILES ?= $(shell find ./scripts -name *.sh)
|
SH_FILES ?= $(shell find ./scripts -name *.sh)
|
||||||
GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev)
|
GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev)
|
||||||
GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev)
|
|
||||||
GO_BUILD_FLAGS += $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS))
|
GO_BUILD_FLAGS += $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS))
|
||||||
|
|
||||||
targets := $(shell echo '$(sources)' | tr "," " ")
|
targets := $(shell echo '$(sources)' | tr "," " ")
|
||||||
|
|
||||||
|
GO_INTEGRATION_TESTS := $(shell find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u)
|
||||||
|
|
||||||
all: deps build
|
all: deps build
|
||||||
|
|
||||||
##@ Dependencies
|
##@ Dependencies
|
||||||
@@ -35,36 +36,68 @@ node_modules: package.json yarn.lock ## Install node modules.
|
|||||||
|
|
||||||
##@ Swagger
|
##@ Swagger
|
||||||
SPEC_TARGET = public/api-spec.json
|
SPEC_TARGET = public/api-spec.json
|
||||||
MERGED_SPEC_TARGET := public/api-merged.json
|
ENTERPRISE_SPEC_TARGET = public/api-enterprise-spec.json
|
||||||
|
MERGED_SPEC_TARGET = public/api-merged.json
|
||||||
NGALERT_SPEC_TARGET = pkg/services/ngalert/api/tooling/api.json
|
NGALERT_SPEC_TARGET = pkg/services/ngalert/api/tooling/api.json
|
||||||
|
|
||||||
$(NGALERT_SPEC_TARGET):
|
$(NGALERT_SPEC_TARGET):
|
||||||
+$(MAKE) -C pkg/services/ngalert/api/tooling api.json
|
+$(MAKE) -C pkg/services/ngalert/api/tooling api.json
|
||||||
|
|
||||||
$(MERGED_SPEC_TARGET): $(SPEC_TARGET) $(NGALERT_SPEC_TARGET) $(SWAGGER) ## Merge generated and ngalert API specs
|
$(MERGED_SPEC_TARGET): swagger-oss-gen swagger-enterprise-gen $(NGALERT_SPEC_TARGET) $(SWAGGER) ## Merge generated and ngalert API specs
|
||||||
# known conflicts DsPermissionType, AddApiKeyCommand, Json, Duration (identical models referenced by both specs)
|
# known conflicts DsPermissionType, AddApiKeyCommand, Json, Duration (identical models referenced by both specs)
|
||||||
$(SWAGGER) mixin $(SPEC_TARGET) $(NGALERT_SPEC_TARGET) --ignore-conflicts -o $(MERGED_SPEC_TARGET)
|
$(SWAGGER) mixin $(SPEC_TARGET) $(ENTERPRISE_SPEC_TARGET) $(NGALERT_SPEC_TARGET) --ignore-conflicts -o $(MERGED_SPEC_TARGET)
|
||||||
|
|
||||||
$(SPEC_TARGET): $(SWAGGER) ## Generate API Swagger specification
|
swagger-oss-gen: $(SWAGGER) ## Generate API Swagger specification
|
||||||
|
@echo "re-generating swagger for OSS"
|
||||||
|
rm -f $(SPEC_TARGET)
|
||||||
SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -m -w pkg/server -o $(SPEC_TARGET) \
|
SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -m -w pkg/server -o $(SPEC_TARGET) \
|
||||||
-x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \
|
-x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \
|
||||||
-x "github.com/prometheus/alertmanager" \
|
-x "github.com/prometheus/alertmanager" \
|
||||||
-i pkg/api/swagger_tags.json \
|
-i pkg/api/swagger_tags.json \
|
||||||
--exclude-tag=alpha
|
--exclude-tag=alpha \
|
||||||
go run pkg/services/ngalert/api/tooling/cmd/clean-swagger/main.go -if $@ -of $@
|
--exclude-tag=enterprise
|
||||||
|
|
||||||
swagger-api-spec: gen-go $(SPEC_TARGET) $(MERGED_SPEC_TARGET) validate-api-spec
|
# this file only exists if enterprise is enabled
|
||||||
|
ENTERPRISE_EXT_FILE = pkg/extensions/ext.go
|
||||||
|
ifeq ("$(wildcard $(ENTERPRISE_EXT_FILE))","") ## if enterprise is not enabled
|
||||||
|
swagger-enterprise-gen:
|
||||||
|
@echo "skipping re-generating swagger for enterprise: not enabled"
|
||||||
|
else
|
||||||
|
swagger-enterprise-gen: $(SWAGGER) ## Generate API Swagger specification
|
||||||
|
@echo "re-generating swagger for enterprise"
|
||||||
|
rm -f $(ENTERPRISE_SPEC_TARGET)
|
||||||
|
SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -m -w pkg/server -o $(ENTERPRISE_SPEC_TARGET) \
|
||||||
|
-x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \
|
||||||
|
-x "github.com/prometheus/alertmanager" \
|
||||||
|
-i pkg/api/swagger_tags.json \
|
||||||
|
--exclude-tag=alpha \
|
||||||
|
--include-tag=enterprise
|
||||||
|
endif
|
||||||
|
|
||||||
validate-api-spec: $(MERGED_SPEC_TARGET) $(SWAGGER) ## Validate API spec
|
swagger-gen: gen-go $(MERGED_SPEC_TARGET) swagger-validate
|
||||||
|
|
||||||
|
swagger-validate: $(MERGED_SPEC_TARGET) $(SWAGGER) ## Validate API spec
|
||||||
$(SWAGGER) validate $(<)
|
$(SWAGGER) validate $(<)
|
||||||
|
|
||||||
clean-api-spec:
|
swagger-clean:
|
||||||
rm -f $(SPEC_TARGET) $(MERGED_SPEC_TARGET) $(OAPI_SPEC_TARGET)
|
rm -f $(SPEC_TARGET) $(MERGED_SPEC_TARGET) $(OAPI_SPEC_TARGET)
|
||||||
|
|
||||||
|
.PHONY: cleanup-old-git-hooks
|
||||||
|
cleanup-old-git-hooks:
|
||||||
|
./scripts/cleanup-husky.sh
|
||||||
|
|
||||||
|
.PHONY: lefthook-install
|
||||||
|
lefthook-install: cleanup-old-git-hooks $(LEFTHOOK) # install lefthook for pre-commit hooks
|
||||||
|
$(LEFTHOOK) install -f
|
||||||
|
|
||||||
|
.PHONY: lefthook-uninstall
|
||||||
|
lefthook-uninstall: $(LEFTHOOK)
|
||||||
|
$(LEFTHOOK) uninstall
|
||||||
|
|
||||||
##@ OpenAPI 3
|
##@ OpenAPI 3
|
||||||
OAPI_SPEC_TARGET = public/openapi3.json
|
OAPI_SPEC_TARGET = public/openapi3.json
|
||||||
|
|
||||||
openapi3-gen: swagger-api-spec ## Generates OpenApi 3 specs from the Swagger 2 already generated
|
openapi3-gen: swagger-gen ## Generates OpenApi 3 specs from the Swagger 2 already generated
|
||||||
$(GO) run scripts/openapi3/openapi3conv.go $(MERGED_SPEC_TARGET) $(OAPI_SPEC_TARGET)
|
$(GO) run scripts/openapi3/openapi3conv.go $(MERGED_SPEC_TARGET) $(OAPI_SPEC_TARGET)
|
||||||
|
|
||||||
##@ Building
|
##@ Building
|
||||||
@@ -73,9 +106,8 @@ gen-cue: ## Do all CUE/Thema code generation
|
|||||||
go generate ./pkg/plugins/plugindef
|
go generate ./pkg/plugins/plugindef
|
||||||
go generate ./kinds/gen.go
|
go generate ./kinds/gen.go
|
||||||
go generate ./public/app/plugins/gen.go
|
go generate ./public/app/plugins/gen.go
|
||||||
go generate ./pkg/kindsys/report.go
|
|
||||||
|
|
||||||
gen-go: $(WIRE) gen-cue
|
gen-go: $(WIRE)
|
||||||
@echo "generate go files"
|
@echo "generate go files"
|
||||||
$(WIRE) gen -tags $(WIRE_TAGS) ./pkg/server
|
$(WIRE) gen -tags $(WIRE_TAGS) ./pkg/server
|
||||||
|
|
||||||
@@ -129,19 +161,39 @@ test-go-unit: ## Run unit tests for backend with flags.
|
|||||||
.PHONY: test-go-integration
|
.PHONY: test-go-integration
|
||||||
test-go-integration: ## Run integration tests for backend with flags.
|
test-go-integration: ## Run integration tests for backend with flags.
|
||||||
@echo "test backend integration tests"
|
@echo "test backend integration tests"
|
||||||
$(GO) test -run Integration -covermode=atomic -timeout=30m ./pkg/...
|
$(GO) test -count=1 -run "^TestIntegration" -covermode=atomic -timeout=5m $(GO_INTEGRATION_TESTS)
|
||||||
|
|
||||||
|
.PHONY: test-go-integration-alertmanager
|
||||||
|
test-go-integration-alertmanager: ## Run integration tests for the remote alertmanager (config taken from the mimir_backend block).
|
||||||
|
@echo "test remote alertmanager integration tests"
|
||||||
|
$(GO) clean -testcache
|
||||||
|
AM_URL=http://localhost:8080 AM_TENANT_ID=test AM_PASSWORD=test \
|
||||||
|
$(GO) test -count=1 -run "^TestIntegrationRemoteAlertmanager" -covermode=atomic -timeout=5m ./pkg/services/ngalert/notifier/...
|
||||||
|
|
||||||
.PHONY: test-go-integration-postgres
|
.PHONY: test-go-integration-postgres
|
||||||
test-go-integration-postgres: devenv-postgres ## Run integration tests for postgres backend with flags.
|
test-go-integration-postgres: devenv-postgres ## Run integration tests for postgres backend with flags.
|
||||||
@echo "test backend integration postgres tests"
|
@echo "test backend integration postgres tests"
|
||||||
$(GO) clean -testcache
|
$(GO) clean -testcache
|
||||||
$(GO) list './pkg/...' | xargs -I {} sh -c 'GRAFANA_TEST_DB=postgres go test -run Integration -covermode=atomic -timeout=2m {}'
|
GRAFANA_TEST_DB=postgres \
|
||||||
|
$(GO) test -p=1 -count=1 -run "^TestIntegration" -covermode=atomic -timeout=10m $(GO_INTEGRATION_TESTS)
|
||||||
|
|
||||||
.PHONY: test-go-integration-mysql
|
.PHONY: test-go-integration-mysql
|
||||||
test-go-integration-mysql: devenv-mysql ## Run integration tests for mysql backend with flags.
|
test-go-integration-mysql: devenv-mysql ## Run integration tests for mysql backend with flags.
|
||||||
@echo "test backend integration mysql tests"
|
@echo "test backend integration mysql tests"
|
||||||
|
GRAFANA_TEST_DB=mysql \
|
||||||
|
$(GO) test -p=1 -count=1 -run "^TestIntegration" -covermode=atomic -timeout=10m $(GO_INTEGRATION_TESTS)
|
||||||
|
|
||||||
|
.PHONY: test-go-integration-redis
|
||||||
|
test-go-integration-redis: ## Run integration tests for redis cache.
|
||||||
|
@echo "test backend integration redis tests"
|
||||||
$(GO) clean -testcache
|
$(GO) clean -testcache
|
||||||
$(GO) list './pkg/...' | xargs -I {} sh -c 'GRAFANA_TEST_DB=mysql go test -run Integration -covermode=atomic -timeout=2m {}'
|
REDIS_URL=localhost:6379 $(GO) test -run IntegrationRedis -covermode=atomic -timeout=2m $(GO_INTEGRATION_TESTS)
|
||||||
|
|
||||||
|
.PHONY: test-go-integration-memcached
|
||||||
|
test-go-integration-memcached: ## Run integration tests for memcached cache.
|
||||||
|
@echo "test backend integration memcached tests"
|
||||||
|
$(GO) clean -testcache
|
||||||
|
MEMCACHED_HOSTS=localhost:11211 $(GO) test -run IntegrationMemcached -covermode=atomic -timeout=2m $(GO_INTEGRATION_TESTS)
|
||||||
|
|
||||||
test-js: ## Run tests for frontend.
|
test-js: ## Run tests for frontend.
|
||||||
@echo "test frontend"
|
@echo "test frontend"
|
||||||
@@ -176,6 +228,8 @@ build-docker-full: ## Build Docker image for development.
|
|||||||
--build-arg BINGO=false \
|
--build-arg BINGO=false \
|
||||||
--build-arg GO_BUILD_TAGS=$(GO_BUILD_TAGS) \
|
--build-arg GO_BUILD_TAGS=$(GO_BUILD_TAGS) \
|
||||||
--build-arg WIRE_TAGS=$(WIRE_TAGS) \
|
--build-arg WIRE_TAGS=$(WIRE_TAGS) \
|
||||||
|
--build-arg COMMIT_SHA=$$(git rev-parse HEAD) \
|
||||||
|
--build-arg BUILD_BRANCH=$$(git rev-parse --abbrev-ref HEAD) \
|
||||||
--tag grafana/grafana$(TAG_SUFFIX):dev \
|
--tag grafana/grafana$(TAG_SUFFIX):dev \
|
||||||
$(DOCKER_BUILD_ARGS)
|
$(DOCKER_BUILD_ARGS)
|
||||||
|
|
||||||
@@ -187,8 +241,10 @@ build-docker-full-ubuntu: ## Build Docker image based on Ubuntu for development.
|
|||||||
--build-arg BINGO=false \
|
--build-arg BINGO=false \
|
||||||
--build-arg GO_BUILD_TAGS=$(GO_BUILD_TAGS) \
|
--build-arg GO_BUILD_TAGS=$(GO_BUILD_TAGS) \
|
||||||
--build-arg WIRE_TAGS=$(WIRE_TAGS) \
|
--build-arg WIRE_TAGS=$(WIRE_TAGS) \
|
||||||
--build-arg BASE_IMAGE=ubuntu:20.04 \
|
--build-arg COMMIT_SHA=$$(git rev-parse HEAD) \
|
||||||
--build-arg GO_IMAGE=golang:1.20.1 \
|
--build-arg BUILD_BRANCH=$$(git rev-parse --abbrev-ref HEAD) \
|
||||||
|
--build-arg BASE_IMAGE=ubuntu:22.04 \
|
||||||
|
--build-arg GO_IMAGE=golang:1.21.10 \
|
||||||
--tag grafana/grafana$(TAG_SUFFIX):dev-ubuntu \
|
--tag grafana/grafana$(TAG_SUFFIX):dev-ubuntu \
|
||||||
$(DOCKER_BUILD_ARGS)
|
$(DOCKER_BUILD_ARGS)
|
||||||
|
|
||||||
@@ -233,6 +289,9 @@ devenv-mysql:
|
|||||||
protobuf: ## Compile protobuf definitions
|
protobuf: ## Compile protobuf definitions
|
||||||
bash scripts/protobuf-check.sh
|
bash scripts/protobuf-check.sh
|
||||||
bash pkg/plugins/backendplugin/pluginextensionv2/generate.sh
|
bash pkg/plugins/backendplugin/pluginextensionv2/generate.sh
|
||||||
|
bash pkg/plugins/backendplugin/secretsmanagerplugin/generate.sh
|
||||||
|
bash pkg/services/store/entity/generate.sh
|
||||||
|
bash pkg/infra/grn/generate.sh
|
||||||
|
|
||||||
clean: ## Clean up intermediate build artifacts.
|
clean: ## Clean up intermediate build artifacts.
|
||||||
@echo "cleaning"
|
@echo "cleaning"
|
||||||
@@ -258,7 +317,7 @@ scripts/drone/TAGS: $(shell find scripts/drone -name '*.star')
|
|||||||
etags --lang none --regex="/def \(\w+\)[^:]+:/\1/" --regex="/\s*\(\w+\) =/\1/" $^ -o $@
|
etags --lang none --regex="/def \(\w+\)[^:]+:/\1/" --regex="/\s*\(\w+\) =/\1/" $^ -o $@
|
||||||
|
|
||||||
format-drone:
|
format-drone:
|
||||||
buildifier -r scripts/drone
|
buildifier --lint=fix -r scripts/drone
|
||||||
|
|
||||||
help: ## Display this help.
|
help: ## Display this help.
|
||||||
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
|
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
|
||||||
|
|||||||
@@ -90,6 +90,14 @@ read_timeout = 0
|
|||||||
#exampleHeader1 = exampleValue1
|
#exampleHeader1 = exampleValue1
|
||||||
#exampleHeader2 = exampleValue2
|
#exampleHeader2 = exampleValue2
|
||||||
|
|
||||||
|
#################################### GRPC Server #########################
|
||||||
|
[grpc_server]
|
||||||
|
network = "tcp"
|
||||||
|
address = "127.0.0.1:10000"
|
||||||
|
use_tls = false
|
||||||
|
cert_file =
|
||||||
|
key_file =
|
||||||
|
|
||||||
#################################### Database ############################
|
#################################### Database ############################
|
||||||
[database]
|
[database]
|
||||||
# You can configure the database connection by specifying type, host, name, user and password
|
# You can configure the database connection by specifying type, host, name, user and password
|
||||||
@@ -231,7 +239,7 @@ reporting_distributor = grafana-labs
|
|||||||
# for new versions of grafana. The check is used
|
# for new versions of grafana. The check is used
|
||||||
# in some UI views to notify that a grafana update exists.
|
# in some UI views to notify that a grafana update exists.
|
||||||
# This option does not cause any auto updates, nor send any information
|
# This option does not cause any auto updates, nor send any information
|
||||||
# only a GET request to https://raw.githubusercontent.com/grafana/grafana/main/latest.json to get the latest version.
|
# only a GET request to https://grafana.com/api/grafana/versions/stable to get the latest version.
|
||||||
check_for_updates = true
|
check_for_updates = true
|
||||||
|
|
||||||
# Set to false to disable all checks to https://grafana.com
|
# Set to false to disable all checks to https://grafana.com
|
||||||
@@ -405,6 +413,21 @@ default_home_dashboard_path =
|
|||||||
# Upper limit of data sources that Grafana will return. This limit is a temporary configuration and it will be deprecated when pagination will be introduced on the list data sources API.
|
# Upper limit of data sources that Grafana will return. This limit is a temporary configuration and it will be deprecated when pagination will be introduced on the list data sources API.
|
||||||
datasource_limit = 5000
|
datasource_limit = 5000
|
||||||
|
|
||||||
|
|
||||||
|
################################### SQL Data Sources #####################
|
||||||
|
[sql_datasources]
|
||||||
|
# Default maximum number of open connections maintained in the connection pool
|
||||||
|
# when connecting to SQL based data sources
|
||||||
|
max_open_conns_default = 100
|
||||||
|
|
||||||
|
# Default maximum number of idle connections maintained in the connection pool
|
||||||
|
# when connecting to SQL based data sources
|
||||||
|
max_idle_conns_default = 100
|
||||||
|
|
||||||
|
# Default maximum connection lifetime used when connecting
|
||||||
|
# to SQL based data sources.
|
||||||
|
max_conn_lifetime_default = 14400
|
||||||
|
|
||||||
#################################### Users ###############################
|
#################################### Users ###############################
|
||||||
[users]
|
[users]
|
||||||
# disable user signup / registration
|
# disable user signup / registration
|
||||||
@@ -508,6 +531,20 @@ 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
|
||||||
|
|
||||||
|
# Set to true to include id of identity as a response header
|
||||||
|
id_response_header_enabled = false
|
||||||
|
|
||||||
|
# Prefix used for the id response header, X-Grafana-Identity-Id
|
||||||
|
id_response_header_prefix = X-Grafana
|
||||||
|
|
||||||
|
# List of identity namespaces to add id response headers for, separated by space.
|
||||||
|
# Available namespaces are user, api-key and service-account.
|
||||||
|
# The header value will encode the namespace ("user:<id>", "api-key:<id>", "service-account:<id>")
|
||||||
|
id_response_header_namespaces = user api-key service-account
|
||||||
|
|
||||||
#################################### Anonymous Auth ######################
|
#################################### Anonymous Auth ######################
|
||||||
[auth.anonymous]
|
[auth.anonymous]
|
||||||
# enable anonymous access
|
# enable anonymous access
|
||||||
@@ -541,6 +578,7 @@ 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_skip_verify_insecure = false
|
||||||
|
|
||||||
#################################### GitLab Auth #########################
|
#################################### GitLab Auth #########################
|
||||||
@@ -756,6 +794,24 @@ managed_identity_enabled = false
|
|||||||
# Should be set for user-assigned identity and should be empty for system-assigned identity
|
# Should be set for user-assigned identity and should be empty for system-assigned identity
|
||||||
managed_identity_client_id =
|
managed_identity_client_id =
|
||||||
|
|
||||||
|
# Specifies whether Azure AD Workload Identity authentication should be enabled in datasources that support it
|
||||||
|
# For more documentation on Azure AD Workload Identity, review this documentation:
|
||||||
|
# https://azure.github.io/azure-workload-identity/docs/
|
||||||
|
# Disabled by default, needs to be explicitly enabled
|
||||||
|
workload_identity_enabled = false
|
||||||
|
|
||||||
|
# Tenant ID of the Azure AD Workload Identity
|
||||||
|
# Allows to override default tenant ID of the Azure AD identity associated with the Kubernetes service account
|
||||||
|
workload_identity_tenant_id =
|
||||||
|
|
||||||
|
# Client ID of the Azure AD Workload Identity
|
||||||
|
# Allows to override default client ID of the Azure AD identity associated with the Kubernetes service account
|
||||||
|
workload_identity_client_id =
|
||||||
|
|
||||||
|
# Custom path to token file for the Azure AD Workload Identity
|
||||||
|
# Allows to set a custom path to the projected service account token file
|
||||||
|
workload_identity_token_file =
|
||||||
|
|
||||||
#################################### Role-based Access Control ###########
|
#################################### Role-based Access Control ###########
|
||||||
[rbac]
|
[rbac]
|
||||||
# If enabled, cache permissions in a in memory cache
|
# If enabled, cache permissions in a in memory cache
|
||||||
@@ -971,13 +1027,18 @@ execute_alerts = true
|
|||||||
# The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
# The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
||||||
evaluation_timeout = 30s
|
evaluation_timeout = 30s
|
||||||
|
|
||||||
# Number of times we'll attempt to evaluate an alert rule before giving up on that evaluation. This option has a legacy version in the `[alerting]` section that takes precedence.
|
# Number of times we'll attempt to evaluate an alert rule before giving up on that evaluation. The default value is 1.
|
||||||
max_attempts = 3
|
max_attempts = 1
|
||||||
|
|
||||||
# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has a legacy version in the `[alerting]` section that takes precedence.
|
# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has a legacy version in the `[alerting]` section that takes precedence.
|
||||||
# The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
# The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
||||||
min_interval = 10s
|
min_interval = 10s
|
||||||
|
|
||||||
|
# This is an experimental option to add parallelization to saving alert states in the database.
|
||||||
|
# It configures the maximum number of concurrent queries per rule evaluated. The default value is 1
|
||||||
|
# (concurrent queries per rule disabled).
|
||||||
|
max_state_save_concurrency = 1
|
||||||
|
|
||||||
[unified_alerting.screenshots]
|
[unified_alerting.screenshots]
|
||||||
# Enable screenshots in notifications. You must have either installed the Grafana image rendering
|
# Enable screenshots in notifications. You must have either installed the Grafana image rendering
|
||||||
# plugin, or set up Grafana to use a remote rendering service.
|
# plugin, or set up Grafana to use a remote rendering service.
|
||||||
|
|||||||
@@ -91,6 +91,14 @@
|
|||||||
#exampleHeader1 = exampleValue1
|
#exampleHeader1 = exampleValue1
|
||||||
#exampleHeader2 = exampleValue2
|
#exampleHeader2 = exampleValue2
|
||||||
|
|
||||||
|
#################################### GRPC Server #########################
|
||||||
|
;[grpc_server]
|
||||||
|
;network = "tcp"
|
||||||
|
;address = "127.0.0.1:10000"
|
||||||
|
;use_tls = false
|
||||||
|
;cert_file =
|
||||||
|
;key_file =
|
||||||
|
|
||||||
#################################### Database ####################################
|
#################################### Database ####################################
|
||||||
[database]
|
[database]
|
||||||
# You can configure the database connection by specifying type, host, name, user and password
|
# You can configure the database connection by specifying type, host, name, user and password
|
||||||
@@ -238,7 +246,7 @@
|
|||||||
# for new versions of grafana. The check is used
|
# for new versions of grafana. The check is used
|
||||||
# in some UI views to notify that a grafana update exists.
|
# in some UI views to notify that a grafana update exists.
|
||||||
# This option does not cause any auto updates, nor send any information
|
# This option does not cause any auto updates, nor send any information
|
||||||
# only a GET request to https://raw.githubusercontent.com/grafana/grafana/main/latest.json to get the latest version.
|
# only a GET request to https://grafana.com/api/grafana/versions/stable to get the latest version.
|
||||||
;check_for_updates = true
|
;check_for_updates = true
|
||||||
|
|
||||||
# Set to false to disable all checks to https://grafana.com
|
# Set to false to disable all checks to https://grafana.com
|
||||||
@@ -512,6 +520,20 @@
|
|||||||
# 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
|
||||||
|
|
||||||
|
# Set to true to include id of identity as a response header
|
||||||
|
;id_response_header_enabled = false
|
||||||
|
|
||||||
|
# Prefix used for the id response header, X-Grafana-Identity-Id
|
||||||
|
;id_response_header_prefix = X-Grafana
|
||||||
|
|
||||||
|
# List of identity namespaces to add id response headers for, separated by space.
|
||||||
|
# Available namespaces are user, api-key and service-account.
|
||||||
|
# The header value will encode the namespace ("user:<id>", "api-key:<id>", "service-account:<id>")
|
||||||
|
;id_response_header_namespaces = user api-key service-account
|
||||||
|
|
||||||
#################################### Anonymous Auth ######################
|
#################################### Anonymous Auth ######################
|
||||||
[auth.anonymous]
|
[auth.anonymous]
|
||||||
# enable anonymous access
|
# enable anonymous access
|
||||||
@@ -545,6 +567,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]
|
||||||
@@ -742,6 +765,24 @@
|
|||||||
# Should be set for user-assigned identity and should be empty for system-assigned identity
|
# Should be set for user-assigned identity and should be empty for system-assigned identity
|
||||||
;managed_identity_client_id =
|
;managed_identity_client_id =
|
||||||
|
|
||||||
|
# Specifies whether Azure AD Workload Identity authentication should be enabled in datasources that support it
|
||||||
|
# For more documentation on Azure AD Workload Identity, review this documentation:
|
||||||
|
# https://azure.github.io/azure-workload-identity/docs/
|
||||||
|
# Disabled by default, needs to be explicitly enabled
|
||||||
|
;workload_identity_enabled = false
|
||||||
|
|
||||||
|
# Tenant ID of the Azure AD Workload Identity
|
||||||
|
# Allows to override default tenant ID of the Azure AD identity associated with the Kubernetes service account
|
||||||
|
;workload_identity_tenant_id =
|
||||||
|
|
||||||
|
# Client ID of the Azure AD Workload Identity
|
||||||
|
# Allows to override default client ID of the Azure AD identity associated with the Kubernetes service account
|
||||||
|
;workload_identity_client_id =
|
||||||
|
|
||||||
|
# Custom path to token file for the Azure AD Workload Identity
|
||||||
|
# Allows to set a custom path to the projected service account token file
|
||||||
|
;workload_identity_token_file =
|
||||||
|
|
||||||
#################################### Role-based Access Control ###########
|
#################################### Role-based Access Control ###########
|
||||||
[rbac]
|
[rbac]
|
||||||
;permission_cache = true
|
;permission_cache = true
|
||||||
@@ -955,8 +996,8 @@
|
|||||||
# The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
# The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
||||||
;evaluation_timeout = 30s
|
;evaluation_timeout = 30s
|
||||||
|
|
||||||
# Number of times we'll attempt to evaluate an alert rule before giving up on that evaluation. This option has a legacy version in the `[alerting]` section that takes precedence.
|
# Number of times we'll attempt to evaluate an alert rule before giving up on that evaluation. The default value is 1.
|
||||||
;max_attempts = 3
|
;max_attempts = 1
|
||||||
|
|
||||||
# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has a legacy version in the `[alerting]` section that takes precedence.
|
# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has a legacy version in the `[alerting]` section that takes precedence.
|
||||||
# The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
# The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
|
||||||
|
|||||||
22
contribute/backend/upgrading-go-version.md
Normal file
22
contribute/backend/upgrading-go-version.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Upgrading Go Version
|
||||||
|
|
||||||
|
Notes on upgrading Go version.
|
||||||
|
|
||||||
|
Example PR: https://github.com/grafana/grafana/pull/79329
|
||||||
|
|
||||||
|
## The main areas that need to change during the upgrade are:
|
||||||
|
|
||||||
|
- https://github.com/grafana/grafana/blob/d8ecea4ed93efb2e4d64a5ee24bc08f3805f413d/scripts/drone/variables.star#L6
|
||||||
|
- https://github.com/grafana/grafana/blob/d8ecea4ed93efb2e4d64a5ee24bc08f3805f413d/Makefile#L264
|
||||||
|
- https://github.com/grafana/grafana/blob/d8ecea4ed93efb2e4d64a5ee24bc08f3805f413d/Dockerfile#L6
|
||||||
|
|
||||||
|
Make sure to run `make drone` so that changes to `.star` files are reflected and `drone.yml` is generated.
|
||||||
|
|
||||||
|
### Additional files to change
|
||||||
|
|
||||||
|
- Take a look in `.github/workflows` folder for what `go` version is being used there in various workflows.
|
||||||
|
- Make sure to create a PR with the corresponding changes in `grafana/grafana-enterprise` repository.
|
||||||
|
|
||||||
|
## Updating the go.mod file
|
||||||
|
|
||||||
|
Please avoid updating the `go.mod` to the newest version unless really necessary. This ensures backwards compatibility and introduces less breaking changes. Always upgrade Go version in the runtime files above first, let them run for a couple of weeks and only then consider updating the `go.mod` file if necessary.
|
||||||
@@ -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 targeting `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:**
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +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 2>&1; then echo podman; else echo docker; fi)
|
include docs.mk
|
||||||
IMAGE = grafana/docs-base:latest
|
|
||||||
CONTENT_PATH = /hugo/content/docs/grafana/latest
|
|
||||||
LOCAL_STATIC_PATH = ../../website/static
|
|
||||||
PORT = 3002:3002
|
|
||||||
|
|
||||||
pull:
|
|
||||||
$(PODMAN) pull $(IMAGE)
|
|
||||||
|
|
||||||
docs: pull
|
|
||||||
$(PODMAN) run --init -v $(shell pwd)/sources:$(CONTENT_PATH):Z -p $(PORT) --rm -it $(IMAGE) make server
|
|
||||||
|
|
||||||
docs-preview: pull
|
|
||||||
$(PODMAN) run --init -v $(shell pwd)/sources:$(CONTENT_PATH):Z -p $(PORT) --rm -it $(IMAGE) make server BUILD_DRAFTS=true
|
|
||||||
|
|
||||||
docs-no-pull:
|
|
||||||
$(PODMAN) run --init -v $(shell pwd)/sources:$(CONTENT_PATH):Z -p $(PORT) --rm -it $(IMAGE) make server
|
|
||||||
|
|
||||||
docs-test: pull
|
|
||||||
$(PODMAN) run --init -v $(shell pwd)/sources:$(CONTENT_PATH):Z --rm -it $(IMAGE) 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 --init -v $(shell pwd)/sources:$(CONTENT_PATH):Z \
|
|
||||||
-v $(shell pwd)/$(LOCAL_STATIC_PATH):/hugo/static:Z -p $(PORT) --rm -it $(IMAGE)
|
|
||||||
|
|
||||||
.PHONY: doc-validator/%
|
|
||||||
doc-validator/%: ## Run doc-validator on a specific path. To lint the path /docs/sources/administration, run 'make doc-validator/administration'.
|
|
||||||
doc-validator/%:
|
|
||||||
$(PODMAN) run --init -v "$(shell pwd)/sources:/sources" grafana/doc-validator:latest --skip-image-validation --include=$(subst doc-validator/,,$@) ./sources /docs/grafana/latest
|
|
||||||
|
|||||||
@@ -1,14 +1,19 @@
|
|||||||
# 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/latest/` 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.
|
||||||
|
|
||||||
|
|||||||
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.
|
||||||
|
# A changelog is included in the head of the `make-docs` script.
|
||||||
|
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 "$(CURDIR)/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
|
||||||
|
$(CURDIR)/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
|
||||||
|
$(CURDIR)/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' $(CURDIR)/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) $(CURDIR)/make-docs $(PROJECTS)
|
||||||
|
|
||||||
|
.PHONY: vale
|
||||||
|
vale: ## Run vale on the entire docs folder.
|
||||||
|
vale: make-docs
|
||||||
|
DOCS_IMAGE=$(VALE_IMAGE) $(CURDIR)/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
|
||||||
656
docs/make-docs
Executable file
656
docs/make-docs
Executable file
@@ -0,0 +1,656 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# The source of this file is https://raw.githubusercontent.com/grafana/writers-toolkit/main/docs/make-docs.
|
||||||
|
# # `make-docs` procedure changelog
|
||||||
|
#
|
||||||
|
# Updates should conform to the guidelines in https://keepachangelog.com/en/1.1.0/.
|
||||||
|
# [Semantic versioning](https://semver.org/) is used to help the reader identify the significance of changes.
|
||||||
|
# Changes are relevant to this script and the support docs.mk GNU Make interface.
|
||||||
|
|
||||||
|
# ## 4.2.1 (2023-09-13)
|
||||||
|
|
||||||
|
# ## Fixed
|
||||||
|
|
||||||
|
# - Improved consistency of the webserver request loop by polling the Hugo port rather than the proxy port.
|
||||||
|
|
||||||
|
# ## 4.2.0 (2023-09-01)
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Retry the initial webserver request up to ten times to allow for the process to start.
|
||||||
|
# If it is still failing after ten seconds, an error message is logged.
|
||||||
|
|
||||||
|
# ## 4.1.1 (2023-07-20)
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Replaced use of `realpath` with POSIX compatible alternative to determine default value for REPOS_PATH.
|
||||||
|
|
||||||
|
# ## 4.1.0 (2023-06-16)
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Mounts of `layouts` and `config` directories for the `website` project.
|
||||||
|
# Ensures that local changes to mounts or shortcodes are reflected in the development server.
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Version inference for versioned docs pages.
|
||||||
|
# Pages in versioned projects now have the `versioned: true` front matter set to ensure that "version" in $.Page.Scratch is set on builds.
|
||||||
|
|
||||||
|
# ## 4.0.0 (2023-06-06)
|
||||||
|
|
||||||
|
# ### Removed
|
||||||
|
|
||||||
|
# - `doc-validator/%` target.
|
||||||
|
# The behavior of the target was not as described.
|
||||||
|
# Instead, to limit `doc-validator` to only specific files, refer to https://grafana.com/docs/writers-toolkit/writing-guide/tooling-and-workflows/validate-technical-documentation/#run-on-specific-files.
|
||||||
|
|
||||||
|
# ## 3.0.0 (2023-05-18)
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Compatibility with the updated Make targets in the `website` repository.
|
||||||
|
# `docs` now runs this script itself, `server-docs` builds the site with the `docs` Hugo environment.
|
||||||
|
|
||||||
|
# ## 2.0.0 (2023-05-18)
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Support for the grafana-cloud/frontend-observability/faro-web-sdk project.
|
||||||
|
# - Use of `doc-validator` v2.0.x which includes breaking changes to command line options.
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Source grafana-cloud project from website repository.
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Support for running the Vale linter with `make vale`.
|
||||||
|
|
||||||
|
# ## 1.2.1 (2023-05-05)
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Use `latest` tag of `grafana/vale` image by default instead of hardcoded older version.
|
||||||
|
# - Fix mounting multiple projects broken by the changes in 1.0.1
|
||||||
|
|
||||||
|
# ## 1.2.0 (2023-05-05)
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Support for running the Vale linter with `make vale`.
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# ## 1.1.0 (2023-05-05)
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Rewrite error output so it can be followed by text editors.
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Fix `docs-debug` container process port.
|
||||||
|
|
||||||
|
# ## 1.0.1 (2023-05-04)
|
||||||
|
|
||||||
|
# ### Fixed
|
||||||
|
|
||||||
|
# - Ensure complete section hierarchy so that all projects have a visible menu.
|
||||||
|
|
||||||
|
# ## 1.0.0 (2023-05-04)
|
||||||
|
|
||||||
|
# ### Added
|
||||||
|
|
||||||
|
# - Build multiple projects simultaneously if all projects are checked out locally.
|
||||||
|
# - Run [`doc-validator`](https://github.com/grafana/technical-documentation/tree/main/tools/cmd/doc-validator) over projects.
|
||||||
|
# - Redirect project root to mounted version.
|
||||||
|
# For example redirect `/docs/grafana/` to `/docs/grafana/latest/`.
|
||||||
|
# - Support for Podman or Docker containers with `PODMAN` environment variable.
|
||||||
|
# - Support for projects:
|
||||||
|
# - agent
|
||||||
|
# - enterprise-logs
|
||||||
|
# - enterprise-metrics
|
||||||
|
# - enterprise-traces
|
||||||
|
# - grafana
|
||||||
|
# - grafana-cloud
|
||||||
|
# - grafana-cloud/machine-learning
|
||||||
|
# - helm-charts/mimir-distributed
|
||||||
|
# - helm-charts/tempo-distributed
|
||||||
|
# - incident
|
||||||
|
# - loki
|
||||||
|
# - mimir
|
||||||
|
# - oncall
|
||||||
|
# - opentelemetry
|
||||||
|
# - phlare
|
||||||
|
# - plugins
|
||||||
|
# - slo
|
||||||
|
# - tempo
|
||||||
|
# - writers-toolkit
|
||||||
|
|
||||||
|
|
||||||
|
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:-$(cd "$(git rev-parse --show-toplevel)/.." && echo "${PWD}")}"
|
||||||
|
|
||||||
|
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_alerting_and_irm_machine_learning='machine-learning'
|
||||||
|
SOURCES_grafana_cloud_alerting_and_irm_slo='slo'
|
||||||
|
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_helm_charts_mimir_distributed='mimir'
|
||||||
|
SOURCES_helm_charts_tempo_distributed='tempo'
|
||||||
|
SOURCES_opentelemetry='opentelemetry-docs'
|
||||||
|
SOURCES_plugins_grafana_splunk_datasource='splunk-datasource'
|
||||||
|
|
||||||
|
VERSIONS_as_code='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_alerting_and_irm_machine_learning='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_alerting_and_irm_slo='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_k6='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_data_configuration_integrations='UNVERSIONED'
|
||||||
|
VERSIONS_grafana_cloud_frontend_observability_faro_web_sdk='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)"
|
||||||
|
|
||||||
|
i=1
|
||||||
|
max=10
|
||||||
|
while [ "${i}" -ne "${max}" ]
|
||||||
|
do
|
||||||
|
sleep 1
|
||||||
|
debg "Retrying request to webserver assuming the process is still starting up."
|
||||||
|
i=$((i + 1))
|
||||||
|
|
||||||
|
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'
|
||||||
|
|
||||||
|
unset i max req url
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
errr 'The build was interrupted or a build error occurred, check the previous logs for possible causes.'
|
||||||
|
note 'You might need to use Ctrl+c to end the process.'
|
||||||
|
|
||||||
|
unset i max req url
|
||||||
|
}
|
||||||
|
|
||||||
|
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=${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:3003 &
|
||||||
|
|
||||||
|
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
|
||||||
@@ -3,6 +3,192 @@ aliases:
|
|||||||
- /docs/grafana/v1.1/
|
- /docs/grafana/v1.1/
|
||||||
- /docs/grafana/v3.1/
|
- /docs/grafana/v3.1/
|
||||||
- guides/reference/admin/
|
- guides/reference/admin/
|
||||||
|
cascade:
|
||||||
|
# Until a better mechanism for arrangement is thought of, the following sequence should be ordered alphabetically by the `_target.path` value.
|
||||||
|
- _target: { path: /docs/grafana/** } # Default to every page having "Enterprise" and "Open source" labels.
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/enterprise-licensing/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/organization-management/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/provisioning/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/recorded-queries/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/roles-and-permissions/access-control/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/administration/stats-and-license/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/alerting/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/dashboards/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/datasources/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/explore/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/fundamentals/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/introduction/grafana-cloud/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/introduction/grafana-enterprise/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/panels-visualizations/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/release-notes/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/search/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/audit-grafana/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/configure-authentication/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/configure-authentication/enhanced-ldap/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/configure-authentication/saml/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target:
|
||||||
|
path: /docs/grafana/*/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/**
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/configure-request-security/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/configure-team-sync/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/setup-grafana/configure-security/export-logs/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/troubleshooting/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
|
||||||
|
- _target: { path: /docs/grafana/*/whatsnew/** }
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
description: Guides, installation, and feature documentation
|
description: Guides, installation, and feature documentation
|
||||||
keywords:
|
keywords:
|
||||||
- grafana
|
- grafana
|
||||||
@@ -40,7 +226,7 @@ title: Grafana documentation
|
|||||||
</div>
|
</div>
|
||||||
<h5>Grafana Cloud</h5>
|
<h5>Grafana Cloud</h5>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://grafana.com/grafana/nightly?edition=oss" class="nav-cards__item nav-cards__item--install">
|
<a href="https://grafana.com/grafana/download/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 +256,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-4/" >}}" class="nav-cards__item nav-cards__item--guide">
|
<a href="{{< relref "whatsnew/whats-new-in-v9-5/" >}}" class="nav-cards__item nav-cards__item--guide">
|
||||||
<h4>What's new in v9.4</h4>
|
<h4>What's new in v9.5</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,10 +1,4 @@
|
|||||||
---
|
---
|
||||||
cascade:
|
|
||||||
labels:
|
|
||||||
products:
|
|
||||||
- cloud
|
|
||||||
- enterprise
|
|
||||||
- oss
|
|
||||||
description: Administration
|
description: Administration
|
||||||
title: Administration
|
title: Administration
|
||||||
weight: 40
|
weight: 40
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ Complete the following steps to migrate from API keys to service accounts using
|
|||||||
This action generates a service account token.
|
This action generates a service account token.
|
||||||
|
|
||||||
1. Store the ID and secret that the system returns to you.
|
1. Store the ID and secret that the system returns to you.
|
||||||
1. Pass the token in the `Authrorization` header, prefixed with `Bearer`.
|
1. Pass the token in the `Authorization` header, prefixed with `Bearer`.
|
||||||
|
|
||||||
This action authenticates API requests.
|
This action authenticates API requests.
|
||||||
|
|
||||||
|
|||||||
15
docs/sources/administration/back-up-grafana/index.md
Normal file
15
docs/sources/administration/back-up-grafana/index.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
description: Describes how to back up a locally provisioned Grafana instance.
|
||||||
|
keywords:
|
||||||
|
- grafana
|
||||||
|
- backup
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- enterprise
|
||||||
|
- oss
|
||||||
|
title: Back up Grafana
|
||||||
|
weight: 80
|
||||||
|
menuTitle: Back up Grafana
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< docs/shared lookup="back-up/back-up-grafana.md" source="grafana" version="<GRAFANA VERSION>" >}}
|
||||||
@@ -46,7 +46,8 @@ By default, data sources in an organization can be queried by any user in that o
|
|||||||
|
|
||||||
You can assign data source permissions to users, teams, and roles which will allow access to query or edit the data source.
|
You can assign data source permissions to users, teams, and roles which will allow access to query or edit the data source.
|
||||||
|
|
||||||
1. Navigate to **Administration > Data sources**.
|
1. Click **Connections** in the left-side menu.
|
||||||
|
1. Under Your connections, click **Data sources**.
|
||||||
1. Select the data source to which you want to assign permissions.
|
1. Select the data source to which you want to assign permissions.
|
||||||
1. On the Permissions tab, click **Add a permission**.
|
1. On the Permissions tab, click **Add a permission**.
|
||||||
1. Select **User**, **Team**, or **Role**.
|
1. Select **User**, **Team**, or **Role**.
|
||||||
@@ -58,7 +59,8 @@ You can assign data source permissions to users, teams, and roles which will all
|
|||||||
|
|
||||||
### Edit data source permissions for users, teams, or roles
|
### Edit data source permissions for users, teams, or roles
|
||||||
|
|
||||||
1. Navigate to **Administration > Data sources**.
|
1. Click **Connections** in the left-side menu.
|
||||||
|
1. Under Your connections, click **Data sources**.
|
||||||
1. Select the data source for which you want to edit permissions.
|
1. Select the data source for which you want to edit permissions.
|
||||||
1. On the Permissions tab, find the user, team, or role permission you want to update.
|
1. On the Permissions tab, find the user, team, or role permission you want to update.
|
||||||
1. Select a different option in the **Permission** dropdown.
|
1. Select a different option in the **Permission** dropdown.
|
||||||
@@ -67,7 +69,8 @@ You can assign data source permissions to users, teams, and roles which will all
|
|||||||
|
|
||||||
### Remove data source permissions for users, teams, or roles
|
### Remove data source permissions for users, teams, or roles
|
||||||
|
|
||||||
1. Navigate to **Administration > Data sources**.
|
1. Click **Connections** in the left-side menu.
|
||||||
|
1. Under Your connections, click **Data sources**.
|
||||||
1. Select the data source from which you want to remove permissions.
|
1. Select the data source from which you want to remove permissions.
|
||||||
1. On the Permissions tab, find the user, team, or role permission you want to remove.
|
1. On the Permissions tab, find the user, team, or role permission you want to remove.
|
||||||
1. Click the **X** next to the permission.
|
1. Click the **X** next to the permission.
|
||||||
@@ -122,9 +125,10 @@ You must be an Org admin or Grafana admin to enable query caching for a data sou
|
|||||||
|
|
||||||
By default, data source queries are not cached. To enable query caching for a single data source:
|
By default, data source queries are not cached. To enable query caching for a single data source:
|
||||||
|
|
||||||
1. On the left-side menu, click **Administration > Data sources**.
|
1. Click **Connections** in the left-side menu.
|
||||||
|
1. Under Your Connections, click **Data sources**.
|
||||||
1. In the data source list, click the data source that you want to turn on caching for.
|
1. In the data source list, click the data source that you want to turn on caching for.
|
||||||
1. Open the Cache tab.
|
1. Go to the Cache tab.
|
||||||
1. Click **Enable**.
|
1. Click **Enable**.
|
||||||
1. (Optional) Choose custom TTLs for the data source's queries and resources caching. If you skip this step, then Grafana uses the default TTL.
|
1. (Optional) Choose custom TTLs for the data source's queries and resources caching. If you skip this step, then Grafana uses the default TTL.
|
||||||
|
|
||||||
@@ -140,9 +144,10 @@ To configure global settings for query caching, refer to the [Query caching sect
|
|||||||
|
|
||||||
To disable query caching for a single data source:
|
To disable query caching for a single data source:
|
||||||
|
|
||||||
1. On the left-side menu, click **Administration > Data sources**.
|
1. Click **Connections** in the left-side menu.
|
||||||
|
1. Under Your Connections, click **Data sources**.
|
||||||
1. In the data source list, click the data source that you want to turn off caching for.
|
1. In the data source list, click the data source that you want to turn off caching for.
|
||||||
1. In the Cache tab, click **Disable**.
|
1. On the Cache tab, click **Disable**.
|
||||||
|
|
||||||
To disable query caching for an entire Grafana instance, set the `enabled` flag to `false` in the [Query caching section of Enterprise Configuration]({{< relref "../../setup-grafana/configure-grafana/enterprise-configuration/#caching" >}}). You will no longer see the Cache tab on any data sources, and no data source queries will be cached.
|
To disable query caching for an entire Grafana instance, set the `enabled` flag to `false` in the [Query caching section of Enterprise Configuration]({{< relref "../../setup-grafana/configure-grafana/enterprise-configuration/#caching" >}}). You will no longer see the Cache tab on any data sources, and no data source queries will be cached.
|
||||||
|
|
||||||
@@ -152,7 +157,8 @@ If you experience performance issues or repeated queries become slower to execut
|
|||||||
|
|
||||||
> **Note:** This action impacts all cache-enabled data sources. If you are using Memcached, the system clears all data from the Memcached instance.
|
> **Note:** This action impacts all cache-enabled data sources. If you are using Memcached, the system clears all data from the Memcached instance.
|
||||||
|
|
||||||
1. On the left-side menu, click **Administration > Data sources**.
|
1. Click **Connections** in the left-side menu.
|
||||||
|
1. Under Your Connections, click **Data sources**.
|
||||||
1. In the data source list, click the data source that you want to clear the cache for.
|
1. In the data source list, click the data source that you want to clear the cache for.
|
||||||
1. In the Cache tab, click **Clear cache**.
|
1. In the Cache tab, click **Clear cache**.
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,6 @@ 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
|
||||||
@@ -52,8 +48,8 @@ There is more than one way to add the license to a Grafana instance:
|
|||||||
This is the preferred option for single instance installations of Grafana Enterprise.
|
This is the preferred option for single instance installations of Grafana Enterprise.
|
||||||
|
|
||||||
1. Sign in as a Grafana server administrator.
|
1. Sign in as a Grafana server administrator.
|
||||||
1. Navigate to **Server Admin > Upgrade** within Grafana.
|
1. Click **Administration > Stats and license** in the side navigation menu.
|
||||||
1. Click **Upload license token file**.
|
1. Click **Upload a new token**.
|
||||||
1. Select your license file, and upload it.
|
1. Select your license file, and upload it.
|
||||||
|
|
||||||
#### Put the `license.jwt` file into the data directory of Grafana
|
#### Put the `license.jwt` file into the data directory of Grafana
|
||||||
@@ -205,7 +201,7 @@ To determine the number of active users:
|
|||||||
|
|
||||||
1. Sign in to Grafana Enterprise as a System Administrator.
|
1. Sign in to Grafana Enterprise as a System Administrator.
|
||||||
|
|
||||||
1. Click **Administration** in the left-side menu.
|
1. Click **Administration** in the side navigation menu.
|
||||||
|
|
||||||
1. Click **Stats and license**.
|
1. Click **Stats and license**.
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ You can use AWS Marketplace to make the following modifications to your Grafana
|
|||||||
|
|
||||||
1. Sign in to Grafana as a Server Administrator.
|
1. Sign in to Grafana as a Server Administrator.
|
||||||
|
|
||||||
1. Click **Administration** in the left-side menu, and then **Stats and license**.
|
1. Click **Administration** in the side navigation menu, and then **Stats and license**.
|
||||||
|
|
||||||
1. In the **Token** section under **Enterprise License**, click **Renew License**.
|
1. In the **Token** section under **Enterprise License**, click **Renew token**.
|
||||||
|
|
||||||
This action retrieves updated license information from AWS.
|
This action retrieves updated license information from AWS.
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,6 @@ 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
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ weight: 600
|
|||||||
|
|
||||||
Besides the wide range of visualizations and data sources that are available immediately after you install Grafana, you can extend your Grafana experience with _plugins_.
|
Besides the wide range of visualizations and data sources that are available immediately after you install Grafana, you can extend your Grafana experience with _plugins_.
|
||||||
|
|
||||||
You can [install]({{< relref "#install-a-plugin" >}}) one of the plugins built by the Grafana community, or [build one yourself]({{< relref "../../developers/plugins/" >}}).
|
You can [install]({{< relref "#install-a-plugin" >}}) one of the plugins built by the Grafana community, or [build one yourself](https://grafana.com/developers/plugin-tools).
|
||||||
|
|
||||||
Grafana supports three types of plugins: [panels](/grafana/plugins?type=panel), [data sources](/plugins?type=datasource), and [apps](/grafana/plugins?type=app).
|
Grafana supports three types of plugins: [panels](/grafana/plugins?type=panel), [data sources](/plugins?type=datasource), and [apps](/grafana/plugins?type=app).
|
||||||
|
|
||||||
@@ -72,18 +72,20 @@ The Plugin catalog allows you to browse and manage plugins from within Grafana.
|
|||||||
</video>
|
</video>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
_Video shows the Plugin catalog in a previous version of Grafana._
|
||||||
|
|
||||||
In order to be able to install / uninstall / update plugins using plugin catalog, you must enable it via the `plugin_admin_enabled` flag in the [configuration]({{< relref "../../setup-grafana/configure-grafana/#plugin_admin_enabled" >}}) file.
|
In order to be able to install / uninstall / update plugins using plugin catalog, you must enable it via the `plugin_admin_enabled` flag in the [configuration]({{< relref "../../setup-grafana/configure-grafana/#plugin_admin_enabled" >}}) file.
|
||||||
Before following the steps below, make sure you are logged in as a Grafana administrator.
|
Before following the steps below, make sure you are logged in as a Grafana administrator.
|
||||||
|
|
||||||
<a id="#plugin-catalog-entry"></a>
|
<a id="#plugin-catalog-entry"></a>
|
||||||
|
|
||||||
- Administrators can find the Plugin catalog at **Configuration > Plugins**.
|
Administrators can find the Plugin catalog at **Administration > Plugins**.
|
||||||
|
|
||||||
### Browse plugins
|
### Browse plugins
|
||||||
|
|
||||||
To browse for available plugins:
|
To browse for available plugins:
|
||||||
|
|
||||||
1. In Grafana, [navigate to the Plugin catalog](#plugin-catalog-entry) to view installed plugins.
|
1. In Grafana, click **Administration > Plugins** in the side navigation menu to view installed plugins.
|
||||||
1. Click the **All** filter to browse all available plugins.
|
1. Click the **All** filter to browse all available plugins.
|
||||||
1. Click the **Data sources**, **Panels**, or **Applications** buttons to filter by plugin type.
|
1. Click the **Data sources**, **Panels**, or **Applications** buttons to filter by plugin type.
|
||||||
|
|
||||||
@@ -91,7 +93,7 @@ To browse for available plugins:
|
|||||||
|
|
||||||
To install a plugin:
|
To install a plugin:
|
||||||
|
|
||||||
1. In Grafana, [navigate to the Plugin catalog](#plugin-catalog-entry) to view installed plugins.
|
1. In Grafana, click **Administration > Plugins** in the side navigation menu to view installed plugins.
|
||||||
1. Browse and find a plugin.
|
1. Browse and find a plugin.
|
||||||
1. Click on the plugin logo.
|
1. Click on the plugin logo.
|
||||||
1. Click **Install**.
|
1. Click **Install**.
|
||||||
@@ -102,7 +104,7 @@ When the update is complete, you see a confirmation message that the installatio
|
|||||||
|
|
||||||
To update a plugin:
|
To update a plugin:
|
||||||
|
|
||||||
1. In Grafana, [navigate to the Plugin catalog](#plugin-catalog-entry) to view installed plugins.
|
1. In Grafana, click **Administration > Plugins** in the side navigation menu to view installed plugins.
|
||||||
1. Click on the plugin logo.
|
1. Click on the plugin logo.
|
||||||
1. Click **Update**.
|
1. Click **Update**.
|
||||||
|
|
||||||
@@ -112,7 +114,7 @@ When the update is complete, you see a confirmation message that the update was
|
|||||||
|
|
||||||
To uninstall a plugin:
|
To uninstall a plugin:
|
||||||
|
|
||||||
1. In Grafana, [navigate to the Plugin catalog](#plugin-catalog-entry) to view installed plugins.
|
1. In Grafana, click **Administration > Plugins** in the side navigation menu to view installed plugins.
|
||||||
1. Click on the plugin logo.
|
1. Click on the plugin logo.
|
||||||
1. Click **Uninstall**.
|
1. Click **Uninstall**.
|
||||||
|
|
||||||
@@ -163,7 +165,7 @@ Grafana also writes an error message to the server log:
|
|||||||
WARN[05-26|12:00:00] Some plugin scanning errors were found errors="plugin '<plugin id>' is unsigned, plugin '<plugin id>' has an invalid signature"
|
WARN[05-26|12:00:00] Some plugin scanning errors were found errors="plugin '<plugin id>' is unsigned, plugin '<plugin id>' has an invalid signature"
|
||||||
```
|
```
|
||||||
|
|
||||||
If you are a plugin developer and want to know how to sign your plugin, refer to [Sign a plugin]({{< relref "../../developers/plugins/sign-a-plugin/" >}}).
|
If you are a plugin developer and want to know how to sign your plugin, refer to [Sign a plugin](https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin).
|
||||||
|
|
||||||
| Signature status | Description |
|
| Signature status | Description |
|
||||||
| ------------------ | ------------------------------------------------------------------------------- |
|
| ------------------ | ------------------------------------------------------------------------------- |
|
||||||
|
|||||||
@@ -5,10 +5,6 @@ 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
|
||||||
---
|
---
|
||||||
@@ -60,8 +56,8 @@ Currently we do not provide any scripts/manifests for configuring Grafana. Rathe
|
|||||||
| Tool | Project |
|
| Tool | Project |
|
||||||
| --------- | -------------------------------------------------------------------------------------------------------------- |
|
| --------- | -------------------------------------------------------------------------------------------------------------- |
|
||||||
| 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/grafana/grafana-ansible-collection](https://github.com/grafana/grafana-ansible-collection) |
|
||||||
| 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/) |
|
||||||
|
|
||||||
@@ -355,8 +351,8 @@ When Grafana starts, it updates/inserts all dashboards available in the configur
|
|||||||
By default, Grafana deletes dashboards in the database if the file is removed. You can disable this behavior using the `disableDeletion` setting.
|
By default, Grafana deletes dashboards in the database if the file is removed. You can disable this behavior using the `disableDeletion` setting.
|
||||||
|
|
||||||
> **Note:** Provisioning allows you to overwrite existing dashboards
|
> **Note:** Provisioning allows you to overwrite existing dashboards
|
||||||
> which leads to problems if you re-use settings that are supposed to be unique.
|
> which leads to problems if you reuse settings that are supposed to be unique.
|
||||||
> Be careful not to re-use the same `title` multiple times within a folder
|
> Be careful not to reuse the same `title` multiple times within a folder
|
||||||
> or `uid` within the same installation as this will cause weird behaviors.
|
> or `uid` within the same installation as this will cause weird behaviors.
|
||||||
|
|
||||||
### Provision folders structure from filesystem to Grafana
|
### Provision folders structure from filesystem to Grafana
|
||||||
|
|||||||
@@ -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. |
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ In [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}})
|
|||||||
> **Note:** Service accounts can only act in the organization they are created for. If you have the same task that is needed for multiple organizations, we recommend creating service accounts in each organization.
|
> **Note:** Service accounts can only act in the organization they are created for. If you have the same task that is needed for multiple organizations, we recommend creating service accounts in each organization.
|
||||||
|
|
||||||
{{< vimeo 742056367 >}}
|
{{< vimeo 742056367 >}}
|
||||||
<br>
|
|
||||||
|
_Video shows service accounts in Grafana v9.1. Refer to [Create a service account in Grafana]({{< relref "#create-a-service-account-in-grafana" >}}) for current instructions._
|
||||||
|
|
||||||
## Service account tokens
|
## Service account tokens
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,7 @@ keywords:
|
|||||||
- configuration
|
- configuration
|
||||||
- server
|
- server
|
||||||
- settings
|
- settings
|
||||||
labels:
|
title: View server statistics and license
|
||||||
products:
|
|
||||||
- enterprise
|
|
||||||
- oss
|
|
||||||
title: Stats and license
|
|
||||||
weight: 400
|
weight: 400
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -25,11 +21,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
|
||||||
|
|
||||||
@@ -38,15 +34,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
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ weight: 500
|
|||||||
|
|
||||||
# Manage dashboard permissions
|
# Manage dashboard permissions
|
||||||
|
|
||||||
Dashboard and dasboard folder permissions enable you to grant a viewer the ability to edit and save dashboard changes, or limit an editor's permission to modify a dashboard.
|
Dashboard and dashboard folder permissions enable you to grant a viewer the ability to edit and save dashboard changes, or limit an editor's permission to modify a dashboard.
|
||||||
|
|
||||||
For more information about dashboard permissions, refer to [Dashboard permissions]({{< relref "../../roles-and-permissions/#dashboard-permissions" >}}).
|
For more information about dashboard permissions, refer to [Dashboard permissions]({{< relref "../../roles-and-permissions/#dashboard-permissions" >}}).
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ When you invite users to join an organization, you assign the **Admin**, **Edito
|
|||||||
> **Note**: It might be that you are currently in the proper organization and don't need to switch organizations.
|
> **Note**: It might be that you are currently in the proper organization and don't need to switch organizations.
|
||||||
|
|
||||||
1. Navigate to **Administration > Users**.
|
1. Navigate to **Administration > Users**.
|
||||||
|
1. Click **Organization users**.
|
||||||
1. Click **Invite**.
|
1. Click **Invite**.
|
||||||
1. Enter the following information:
|
1. Enter the following information:
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,6 @@
|
|||||||
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
|
||||||
---
|
---
|
||||||
@@ -19,6 +14,8 @@ Grafana Alerting is available for Grafana OSS, Grafana Enterprise, or Grafana Cl
|
|||||||
|
|
||||||
Watch this video to learn more about Grafana Alerting: {{< vimeo 720001629 >}}
|
Watch this video to learn more about Grafana Alerting: {{< vimeo 720001629 >}}
|
||||||
|
|
||||||
|
_Video shows Alerting in Grafana v9.0. Refer to [Manage your alert rules]({{< relref "../alerting/alerting-rules/" >}}) for current instructions._
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
The following diagram gives you an overview of how Grafana Alerting works and introduces you to some of the key concepts that work together and form the core of our flexible and powerful alerting engine.
|
The following diagram gives you an overview of how Grafana Alerting works and introduces you to some of the key concepts that work together and form the core of our flexible and powerful alerting engine.
|
||||||
|
|||||||
@@ -8,53 +8,68 @@ keywords:
|
|||||||
- guide
|
- guide
|
||||||
- rules
|
- rules
|
||||||
- create
|
- create
|
||||||
title: Create Grafana managed alert rules
|
title: Create Grafana-managed alert rules
|
||||||
weight: 400
|
weight: 400
|
||||||
---
|
---
|
||||||
|
|
||||||
# Create a Grafana managed alerting rule
|
# Create Grafana-managed alert rules
|
||||||
|
|
||||||
Grafana allows you to create alerting rules that query one or more data sources, reduce or transform the results and compare them to each other or to fixed thresholds. When these are executed, Grafana sends notifications to the contact point. For information on Grafana Alerting, see [About Grafana Alerting]({{< relref "../" >}}) which explains the various components of Grafana Alerting. We also recommend that you familiarize yourself with some of the [fundamental concepts]({{< relref "../fundamentals/" >}}) of Grafana Alerting.
|
Grafana-managed rules are the most flexible alert rule type. They allow you to create alerts that can act on data from any of our supported data sources. In addition to supporting multiple data sources, you can also add expressions to transform your data and set alert conditions. Using images in alert notifications is also supported. This is the only type of rule that allows alerting from multiple data sources in a single rule definition.
|
||||||
|
|
||||||
|
Multiple alert instances can be created as a result of one alert rule (also known as a multi-dimensional alerting).
|
||||||
|
|
||||||
|
For information on Grafana Alerting, see [Introduction to Grafana Alerting](/docs/grafana/next/alerting/fundamentals/), which explains the key concepts and features of Grafana Alerting.
|
||||||
|
|
||||||
Watch this video to learn more about creating alerts: {{< vimeo 720001934 >}}
|
Watch this video to learn more about creating alerts: {{< vimeo 720001934 >}}
|
||||||
|
|
||||||
## Add Grafana managed rule
|
_Video shows Alerting in Grafana v9.0. Refer to [Add Grafana managed rule]({{< relref "#add-grafana-managed-rule" >}}) (following) for current instructions._
|
||||||
|
|
||||||
|
To create a Grafana-managed alert rule, complete the following steps.
|
||||||
|
|
||||||
1. In the left-side menu, click **Alerts & IRM** and then **Alerting**.
|
1. In the left-side menu, click **Alerts & IRM** and then **Alerting**.
|
||||||
1. Click **Alert rules**.
|
2. Click **Alert rules**.
|
||||||
1. Click **+ Create alert rule**. The new alerting rule page opens where the **Grafana managed alerts** option is selected by default.
|
3. Click **+ Create alert rule**. The new alert rule page opens where the **Grafana managed alerts** option is selected by default.
|
||||||
1. In Step 1, add the rule name.
|
4. 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.
|
5. In Step 2, add queries and expressions to evaluate, and then select the alert condition.
|
||||||
|
|
||||||
- For queries, select a data source from the dropdown.
|
- For queries, select a data source from the dropdown.
|
||||||
|
- Specify a [time range](/docs/grafana/latest/dashboards/use-dashboards/?pg=blog&plcmt=body-txt#time-units-and-relative-ranges).
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
Grafana Alerting only supports fixed relative time ranges, for example, `now-24hr: now`.
|
||||||
|
|
||||||
|
It does not support absolute time ranges: `2021-12-02 00:00:00 to 2021-12-05 23:59:592` or semi-relative time ranges: `now/d to: now`.
|
||||||
|
|
||||||
- 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" >}}).
|
- 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 the **Math**, **Reduce**, and **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 the **Math**, **Reduce**, and **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.
|
|
||||||
|
6. In Step 3, specify the alert evaluation interval.
|
||||||
|
|
||||||
- From the **Condition** dropdown, select the query or expression to trigger the alert rule.
|
- From the **Condition** dropdown, 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](#configure-no-data-and-error-handling).
|
||||||
- Click **Preview** to check the result of running the query at this moment. Preview excludes no data and error handling.
|
- Click **Preview** to check the result of running the query at this moment. Preview excludes no data and error handling.
|
||||||
|
|
||||||
**Note:**
|
**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.
|
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.
|
7. In Step 4, add the storage location, rule group, as well as additional metadata associated with the rule.
|
||||||
- From the **Folder** dropdown, select the folder where you want to store the rule.
|
- From the **Folder** dropdown, 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.
|
||||||
- Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "../fundamentals/annotation-label/" >}}).
|
- Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "../fundamentals/annotation-label/" >}}).
|
||||||
- Add Runbook URL, panel, dashboard, and alert IDs.
|
- Add Runbook URL, panel, dashboard, and alert IDs.
|
||||||
1. In Step 5, add custom labels.
|
8. In Step 5, add custom labels.
|
||||||
- Add custom labels selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value .
|
- Add custom labels selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value .
|
||||||
1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page.
|
9. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page.
|
||||||
1. Next, create a for the rule.
|
10. Next, create a for the rule.
|
||||||
|
|
||||||
### Single and multi dimensional rule
|
### Single and multi-dimensional rule
|
||||||
|
|
||||||
For Grafana managed alerts, you can create a rule with a classic condition or you can create a multi-dimensional rule.
|
For Grafana managed alerts, you can create a rule with a classic condition or you can create a multi-dimensional rule.
|
||||||
|
|
||||||
@@ -62,7 +77,9 @@ For Grafana managed alerts, you can create a rule with a classic condition or yo
|
|||||||
|
|
||||||
Use the classic condition expression to create a rule that triggers a single alert when its condition is met. For a query that returns multiple series, Grafana does not track the alert state of each series. As a result, Grafana sends only a single alert even when alert conditions are met for multiple series.
|
Use the classic condition expression to create a rule that triggers a single alert when its condition is met. For a query that returns multiple series, Grafana does not track the alert state of each series. As a result, Grafana sends only a single alert even when alert conditions are met for multiple series.
|
||||||
|
|
||||||
**Multi dimensional rule**
|
For more information, see [expressions documentation]({{< relref "/docs/grafana/latest/panels-visualizations/query-transform-data/expression-queries" >}}).
|
||||||
|
|
||||||
|
**Multi-dimensional rule**
|
||||||
|
|
||||||
To generate a separate alert for each series, create a multi-dimensional rule. Use `Math`, `Reduce`, or `Resample` expressions to create a multi-dimensional rule. For example:
|
To generate a separate alert for each series, create a multi-dimensional rule. Use `Math`, `Reduce`, or `Resample` expressions to create a multi-dimensional rule. For example:
|
||||||
|
|
||||||
@@ -73,22 +90,24 @@ To generate a separate alert for each series, create a multi-dimensional rule. U
|
|||||||
|
|
||||||
> **Note:** Grafana does not support alert queries with template variables. More information is available at <https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514>.
|
> **Note:** Grafana does not support alert queries with template variables. More information is available at <https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514>.
|
||||||
|
|
||||||
#### Rule with classic condition
|
### Configure no data and error handling
|
||||||
|
|
||||||
For more information, see [expressions documentation]({{< relref "/docs/grafana/latest/panels-visualizations/query-transform-data/expression-queries" >}}).
|
Configure alerting behavior when your alert rule evaluation returns no data or an error.
|
||||||
|
|
||||||
### No data and error handling
|
**Note:** Alert rules that are configured to fire when an evaluation returns no data or error only fire when the entire duration of the evaluation period has finished. This means that rather than immediately firing when the alert rule condition is breached, the alert rule waits until the time set as the **For** field has finished and then fires, reducing alert noise and allowing for temporary data availability issues.
|
||||||
|
|
||||||
Configure alerting behavior in the absence of data using information in the following tables.
|
If your alert rule evaluation returns no data, you can set the state on your alert rule to appear as follows:
|
||||||
|
|
||||||
| No Data Option | Description |
|
| No Data | Description |
|
||||||
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
| No Data | Create a new alert `DatasourceNoData` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
|
| No Data | Creates a new alert `DatasourceNoData` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
|
||||||
| Alerting | Set alert rule state to `Alerting`. This option will respect the configured **Evaluate for** pending period. |
|
| Alerting | Sets alert rule state to `Alerting`. The alert rule waits until the time set in the **For** field has finished before firing. |
|
||||||
| Ok | Set alert rule state to `Normal`. |
|
| Ok | Sets alert rule state to `Normal`. |
|
||||||
|
|
||||||
| Error or timeout option | Description |
|
If your evaluation returns an error, you can set the state on your alert rule to appear as follows:
|
||||||
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| 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. |
|
| Error | Description |
|
||||||
| Alerting | Set alert rule state to `Alerting`. This option will respect the configured **Evaluate for** pending period. |
|
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| OK | Set alert rule state to `Normal` |
|
| Error | Creates an alert instance `DatasourceError` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
|
||||||
|
| Alerting | Sets alert rule state to `Alerting`. The alert rule waits until the time set in the **For** field has finished before firing. |
|
||||||
|
| Ok | Sets alert rule state to `Normal`. |
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ Grafana allows you to create alerting rules for an external Grafana Mimir or Lok
|
|||||||
|
|
||||||
Watch this video to learn more about how to create a Mimir managed alert rule: {{< vimeo 720001865 >}}
|
Watch this video to learn more about how to create a Mimir managed alert rule: {{< vimeo 720001865 >}}
|
||||||
|
|
||||||
|
_Video shows Alerting in Grafana v8.5. Refer to [Add a Grafana Mimir or Loki managed alerting rule]({{< relref "#add-a-grafana-mimir-or-loki-managed-alerting-rule" >}}) (following) for current instructions._
|
||||||
|
|
||||||
> **Note:** If you do not want to manage alerting rules for a particular Loki or Prometheus data source, go to its settings and clear the **Manage alerts via Alerting UI** checkbox.
|
> **Note:** If you do not want to manage alerting rules for a particular Loki or Prometheus data source, go to its settings and clear the **Manage alerts via Alerting UI** checkbox.
|
||||||
|
|
||||||
## Add a Grafana Mimir or Loki managed alerting rule
|
## Add a Grafana Mimir or Loki managed alerting rule
|
||||||
|
|||||||
@@ -53,11 +53,11 @@ Alert summary:
|
|||||||
|
|
||||||
You can use any of the following built-in template options to embed custom templates.
|
You can use any of the following built-in template options to embed custom templates.
|
||||||
|
|
||||||
| Name | Notes |
|
| Name | Notes |
|
||||||
| ----------------------- | ------------------------------------------------------------- |
|
| ----------------------- | ------------------------------------------------------------ |
|
||||||
| `default.title` | Displays high-level status information. |
|
| `default.title` | Displays high-level status information. |
|
||||||
| `default.message` | Provides a formatted summary of firing and resolved alerts. |
|
| `default.message` | Provides a formatted summary of firing and resolved alerts. |
|
||||||
| `teams.default.message` | Similar to `default.messsage`, formatted for Microsoft Teams. |
|
| `teams.default.message` | Similar to `default.message`, formatted for Microsoft Teams. |
|
||||||
|
|
||||||
### HTML in notification templates
|
### HTML in notification templates
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -54,6 +54,6 @@ The following table lists the contact point integrations supported by Grafana.
|
|||||||
|
|
||||||
## Useful links
|
## Useful links
|
||||||
|
|
||||||
[Manage contact points](/docs/grafana/next/alerting/manage-notifications/create-contact-point/)
|
[Manage contact points](/docs/grafana/v9.5/alerting/manage-notifications/manage-contact-points/)
|
||||||
|
|
||||||
[Create and edit notification templates](/docs/grafana/next/alerting/manage-notifications/create-message-template/)
|
[Create and edit notification templates](/docs/grafana/v9.5/alerting/manage-notifications/template-notifications/create-notification-templates/)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ 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 "/docs/grafana/latest/developers/plugins/metadata" >}}))
|
- community developed backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json](https://grafana.com/developers/plugin-tools/reference-plugin-json)
|
||||||
|
|
||||||
### Metrics from the alerting engine
|
### Metrics from the alerting engine
|
||||||
|
|
||||||
|
|||||||
46
docs/sources/alerting/legacy-alerting-deprecation.md
Normal file
46
docs/sources/alerting/legacy-alerting-deprecation.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
title: Legacy alerting deprecation
|
||||||
|
description: Legacy alerting deprecation notice
|
||||||
|
weight: 999
|
||||||
|
keywords:
|
||||||
|
- grafana
|
||||||
|
- alerting
|
||||||
|
---
|
||||||
|
|
||||||
|
# Legacy alerting deprecation
|
||||||
|
|
||||||
|
Starting with Grafana v9.0.0, legacy alerting is deprecated, meaning that it is no longer actively maintained or supported by Grafana. As of Grafana v10.0.0, we do not contribute or accept external contributions to the codebase apart from CVE fixes.
|
||||||
|
|
||||||
|
Legacy alerting refers to the old alerting system that was used prior to the introduction of Grafana Alerting; the new alerting system in Grafana.
|
||||||
|
|
||||||
|
The decision to deprecate legacy alerting was made to encourage users to migrate to the new alerting system, which offers a more powerful and flexible alerting experience based on Prometheus Alertmanager.
|
||||||
|
|
||||||
|
Users who are still using legacy alerting are encouraged to migrate their alerts to the new system as soon as possible to ensure that they continue to receive new features, bug fixes, and support.
|
||||||
|
|
||||||
|
However, we will still patch CVEs until legacy alerting is completely removed in Grafana 11; honoring our commitment to building and distributing secure software.
|
||||||
|
|
||||||
|
We have provided [instructions](https://grafana.com/docs/grafana/v9.5/alerting/migrating-alerts/) on how to migrate to the new alerting system, making the process as easy as possible for users.
|
||||||
|
|
||||||
|
## Why are we deprecating legacy alerting?
|
||||||
|
|
||||||
|
The new Grafana alerting system is more powerful and flexible than the legacy alerting feature.
|
||||||
|
|
||||||
|
The new system is based on Prometheus Alertmanager, which offers a more comprehensive set of features for defining and managing alerts. With the new alerting system, users can create alerts based on complex queries, configure alert notifications via various integrations, and set up sophisticated alerting rules with support for conditional expressions, aggregation, and grouping.
|
||||||
|
|
||||||
|
Overall, the new alerting system in Grafana is a major improvement over the legacy alerting feature, providing users with a more powerful and flexible alerting experience.
|
||||||
|
|
||||||
|
Additionally, legacy alerting still requires Angular to function and we are [planning to remove support for it](https://grafana.com/docs/grafana/v9.5/developers/angular_deprecation/) in Grafana 11.
|
||||||
|
|
||||||
|
## When will we remove legacy alerting completely?
|
||||||
|
|
||||||
|
Legacy alerting will be removed from the code-base in Grafana 11, following the same timeline as the [Angular deprecation](https://grafana.com/docs/grafana/v9.5/developers/angular_deprecation/).
|
||||||
|
|
||||||
|
## How do I migrate to the new Grafana alerting?
|
||||||
|
|
||||||
|
Refer to our [migration instructions](https://grafana.com/docs/grafana/v9.5/alerting/migrating-alerts/opt-in/).
|
||||||
|
|
||||||
|
### Links
|
||||||
|
|
||||||
|
- [Upgrade Alerting](https://grafana.com/docs/grafana/v9.5/alerting/migrating-alerts/)
|
||||||
|
- [Legacy alerting differences and limitations](https://grafana.com/docs/grafana/v9.5/alerting/migrating-alerts/migrating-legacy-alerts/)
|
||||||
|
- [Angular support deprecation](https://grafana.com/docs/grafana/v9.5/developers/angular_deprecation/)
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
description: Configure integrations
|
description: Configure integrations
|
||||||
draft: true
|
|
||||||
keywords:
|
keywords:
|
||||||
- Grafana
|
- Grafana
|
||||||
- alerting
|
- alerting
|
||||||
@@ -14,7 +13,7 @@ weight: 100
|
|||||||
|
|
||||||
# Configure integrations
|
# Configure integrations
|
||||||
|
|
||||||
Configure integrations in Grafana to select your preferred communication channel for receiving notifications when your alert rules are fire. Each integration has its own configuration options and setup process. In most cases, this involves providing an API key or a Webhook URL.
|
Configure integrations in Grafana to select your preferred communication channel for receiving notifications when your alert rules are firing. Each integration has its own configuration options and setup process. In most cases, this involves providing an API key or a Webhook URL.
|
||||||
|
|
||||||
Once configured, you can use integrations as part of your contact points to receive notifications whenever your alert changes its state. In this section, we'll cover the basic steps to configure your integrations, so you can start receiving real-time alerts and stay on top of your monitoring data.
|
Once configured, you can use integrations as part of your contact points to receive notifications whenever your alert changes its state. In this section, we'll cover the basic steps to configure your integrations, so you can start receiving real-time alerts and stay on top of your monitoring data.
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ 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 "/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
|
||||||
|
|
||||||
The following table highlights the key differences between mute timings and silences.
|
The following table highlights the key differences between mute timings and silences.
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/
|
||||||
|
- /docs/grafana-cloud/how-do-i/alerts/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/
|
||||||
|
description: Legacy alerting
|
||||||
|
title: Legacy alerting
|
||||||
|
weight: 110
|
||||||
|
---
|
||||||
|
|
||||||
|
# Legacy alerting
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
|
||||||
|
Starting with Grafana v9.0.0, legacy alerting is deprecated. It is no longer actively maintained or supported by Grafana and will be removed in Grafana v11.0.0.
|
||||||
|
|
||||||
|
You have two options to configure alerts within the Grafana Cloud GUI and a third option that enables you to set Grafana Cloud Alerts using the command line.
|
||||||
|
|
||||||
|
- **Grafana alerts** are the same as in an on-prem instance of Grafana.
|
||||||
|
These alerts are created from a graph panel within a Grafana dashboard.
|
||||||
|
This is useful when you want to create a simple alert based on one metric from within a panel.
|
||||||
|
It also has a much simpler learning curve when you are getting started.
|
||||||
|
- **Grafana Cloud alerts - GUI** are an implementation of Prometheus-style rules that enable you to query your Grafana Cloud Metrics and then set up Prometheus Alertmanager-style alerts based on those rules.
|
||||||
|
This is useful when you want to create precise, PromQL-based rules or create alerts from across many metrics and logs being collected into your Grafana Cloud Metrics.
|
||||||
|
This form of alerting is much more powerful and configurable, but that comes with some complexity.
|
||||||
|
- **Grafana Cloud alerts - CLI** use mimirtool to create and upload the same types of Prometheus-style recording and alerting rules definitions to your Grafana Cloud Metrics instance.
|
||||||
|
Once created, you will also be able to view these rules from within the Grafana Cloud Alerting page in the GUI.
|
||||||
|
- **Synthetic Monitoring alerts** are built on Prometheus alerts, just like in Grafana Cloud alerting.
|
||||||
|
You can configure synthetic monitoring alerts separately using the UI in synthetic monitoring.
|
||||||
|
Another option to create alerts for synthetic monitoring checks is to simply use Grafana Cloud alerting.
|
||||||
|
|
||||||
|
## Using Grafana alerts in Grafana Cloud
|
||||||
|
|
||||||
|
Grafana alerts are dashboard panel-driven and can only be created using the Graph panel.
|
||||||
|
This style of alerting builds on top of the query defined for the graph visualization, so alerts and notifications are sent based on breaking some threshold in the associated panel.
|
||||||
|
|
||||||
|
This also means that there is a one-to-one relationship between a Grafana alert and a graph panel.
|
||||||
|
So although Grafana alerts can be viewed centrally, they can only be managed directly from the panel that they’re tied to.
|
||||||
|
As a result, Grafana alerting is best suited for smaller setups, where there are only a few individuals or teams responsible for a small set of dashboards and where there are few dependencies between the dashboards.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Most curated dashboards, such as those provided with an integration or with Synthetic Monitoring do not allow you to alert from panels.
|
||||||
|
This is to preserve the ability to upgrade these dashboards automatically when the integration or Synthetic Monitoring abilities are updated.
|
||||||
|
To create an editable copy that you can edit and alert from, click settings (the gear logo) within any dashboard and then click **Make Editable**.
|
||||||
|
The copy will not be upgraded when/if the curated dashboard receives an update.
|
||||||
|
This is one reason why Grafana Cloud Alerts may be considered a better option.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
### What makes Grafana alerts unique?
|
||||||
|
|
||||||
|
With Grafana alerts, alerts are limited to only graph panels within dashboards.
|
||||||
|
In addition:
|
||||||
|
|
||||||
|
- Alerts can be edited by both Editor and Admin roles
|
||||||
|
- Alerts are visual, with an associated alerting threshold line
|
||||||
|
- Alerts work with many non-Prometheus data sources, including Graphite
|
||||||
|
- Alert notifications can be routed to many external notifier systems, directly from Grafana
|
||||||
|
- Alerts are directly associated with a dashboard
|
||||||
|
- Alerts can be tested
|
||||||
|
|
||||||
|
## Using Grafana Cloud Alerts
|
||||||
|
|
||||||
|
Because the metrics you collect and send to Grafana Cloud are centrally stored in one large time-series database, Grafana Cloud Metrics, you can query across these metrics using [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) and build alerts directly around those metrics rather than around a panel.
|
||||||
|
You can also query across any logs you have sent using Loki.
|
||||||
|
|
||||||
|
Grafana Cloud Alerts are directly tied to metrics and log data.
|
||||||
|
They can be configured either through the UI or by uploading files containing Prometheus and Loki alert rules with mimirtool.
|
||||||
|
|
||||||
|
Grafana Cloud Alerting's Prometheus-style alerts are built by querying directly from the data source itself.
|
||||||
|
Because these alerts are based on the data, they are not tied to a single panel.
|
||||||
|
This makes it possible to evaluate and centrally manage alerts across several different Prometheus and Loki data source instances.
|
||||||
|
|
||||||
|
### What makes Grafana Cloud Alerts unique?
|
||||||
|
|
||||||
|
With Grafana Cloud Alerts, alerts are not limited to coming from a graph panel.
|
||||||
|
In addition, you can:
|
||||||
|
|
||||||
|
- Prevent alerts from being edited, except by users with accounts that are assigned Admin roles.
|
||||||
|
- Centrally manage and create alerts across many systems, teams, and dashboards.
|
||||||
|
Alerts are not bound to just one system, team, or dashboard.
|
||||||
|
- Create alerts for both metric _and_ log data, based on Prometheus and Loki, respectively.
|
||||||
|
- Silence and mute alerts in bulk, even using a schedule, using the Alertmanager.
|
||||||
|
- Route alert notifications to [many external notifier systems](https://prometheus.io/docs/operating/integrations/#alertmanager-webhook-receiver) using Alertmanager configurations
|
||||||
|
- Dedupe alert notifications automatically.
|
||||||
|
|
||||||
|
### Grafana Cloud Alert configuration methods
|
||||||
|
|
||||||
|
In a traditional on-prem environment, Prometheus-style alert configuration is done through the combination of defining a [Prometheus configuration file](https://prometheus.io/docs/prometheus/latest/configuration/configuration/) and an [Alertmanager configuration file](https://prometheus.io/docs/alerting/latest/configuration/), which live close to the Prometheus server.
|
||||||
|
With Grafana Cloud, you can still use this setup as well as more flexible architectures.
|
||||||
|
|
||||||
|
- You can use `mimirtool` to upload your configuration files to be hosted and evaluated entirely in Grafana Cloud.
|
||||||
|
- You can manage both alerting rules and Alertmanager configurations directly through the UI.
|
||||||
|
Configuration files are unnecessary with this setup.
|
||||||
|
- You can use both methods concurrently to manage the alerts.
|
||||||
|
For example, updates made using the `mimirtool` are automatically updated and visible within the Grafana Cloud Alerting interface in minutes.
|
||||||
@@ -0,0 +1,200 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/alerts-rules/
|
||||||
|
- /docs/grafana-cloud/how-do-i/alerts/alerts-rules/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/alerts-rules/
|
||||||
|
- /docs/grafana-cloud/metrics/prometheus/alerts_rules/
|
||||||
|
- /docs/hosted-metrics/prometheus/alerts_rules/
|
||||||
|
description: Prometheus rules with mimirtool
|
||||||
|
title: Prometheus rules with mimirtool
|
||||||
|
weight: 100
|
||||||
|
---
|
||||||
|
|
||||||
|
# Prometheus rules with mimirtool
|
||||||
|
|
||||||
|
This page outlines the steps to use mimirtool and Prometheus-style rules with Grafana Cloud Alerting. You can load Prometheus alerting and recording rules that are evaluated entirely in Grafana Cloud. This allows for global rule evaluation over all of the metrics and logs stored in your Grafana Cloud stack.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
`mimirtool` does _not_ support Loki.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
Prometheus-style alerting is driven by your Grafana Cloud Metrics, Grafana Cloud Logs, and Grafana Cloud Alerts instances. The Metrics and Logs instance holds the rules definition, while the Alerts instance is in charge of routing and managing the alerts that fire from the Metrics and Logs instance. These are separate systems that must be individually configured in order for alerting to work correctly.
|
||||||
|
|
||||||
|
The following sections cover all of these concepts:
|
||||||
|
|
||||||
|
- How to upload alerting and recording rules definition to your Grafana Cloud Metrics instance
|
||||||
|
- How to upload alerting rules definition to your Grafana Cloud Logs instance
|
||||||
|
- How to configure an Alertmanager for your Grafana Cloud Alerts instance, giving you access to the Alertmanager UI.
|
||||||
|
|
||||||
|
**Note:** You need an API key with proper permissions. You can use the same API key for your Metric, Log, and Alerting instances.
|
||||||
|
|
||||||
|
## Download and install mimirtool
|
||||||
|
|
||||||
|
mimirtool is a powerful command-line tool for interacting with Mimir, which powers Grafana Cloud Metrics and Alerts. You'll use mimirtool to upload your metric and log rules definition and the Alertmanager configuration using YAML files.
|
||||||
|
|
||||||
|
For more information, including installation instructions, see [Grafana Mimirtool](/docs/mimir/latest/operators-guide/tools/mimirtool).
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
For mimirtool to interact with Grafana Cloud, you must set the correct configuration variables. Set them using either environment variables or a command line flags.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
## Upload rules definition to your Grafana Cloud Metrics and Logs instance
|
||||||
|
|
||||||
|
First, you'll need to upload your alerting and recording rules to your Metrics and Logs instance. You'll need the instance ID and the URL. These should be part of /orgs/`<yourOrgName>`/.
|
||||||
|
|
||||||
|
### Metrics instance
|
||||||
|
|
||||||
|
Your Metrics instance is likely to be in the `us-central1` region. Its address would be in the form of [https://prometheus-us-central1.grafana.net](https://prometheus-us-central1.grafana.net).
|
||||||
|
|
||||||
|
### Logs instance
|
||||||
|
|
||||||
|
Your Logs instance is likely to be in the `us-central1` region. Its address would be in the form of [https://logs-prod-us-central1.grafana.net](https://logs-prod-us-central1.grafana.net).
|
||||||
|
|
||||||
|
### Using mimirtool
|
||||||
|
|
||||||
|
With your instance ID, URL, and API key you're now ready to upload your rules to your metrics instance. Use the following commands and files as a reference.
|
||||||
|
|
||||||
|
Below is an example alert and rule definition YAML file. Take note of the namespace key which replaces the concept of "files" in this context given each instance only supports 1 configuration file.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# first_rules.yml
|
||||||
|
namespace: 'first_rules'
|
||||||
|
groups:
|
||||||
|
- name: 'shopping_service_rules_and_alerts'
|
||||||
|
rules:
|
||||||
|
- alert: 'PromScrapeFailed'
|
||||||
|
annotations:
|
||||||
|
message: 'Prometheus failed to scrape a target {{ $labels.job }} / {{ $labels.instance }}'
|
||||||
|
expr: 'up != 1'
|
||||||
|
for: '1m'
|
||||||
|
labels:
|
||||||
|
'severity': 'critical'
|
||||||
|
- record: 'job:up:sum'
|
||||||
|
expr: 'sum by(job) (up)'
|
||||||
|
```
|
||||||
|
|
||||||
|
Although both recording and alerting rules are defined under the key `rules` the difference between a rule and and alert is _generally_ (as there are others) whenever the key `record` or `alert` is defined.
|
||||||
|
|
||||||
|
With this file, you can run the following commands to upload your rules file in your Metrics or Logs instance. Keep in mind that these are example commands for your Metrics instance, and they use placeholders and command line flags. Follow a similar pattern for your Logs instances by switching the address to the correct one. The examples also assume that files are located in the same directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mimirtool rules load first_rules.yml \
|
||||||
|
--address=https://prometheus-us-central1.grafana.net \
|
||||||
|
--id=<yourID> \
|
||||||
|
--key=<yourKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, confirm that the rules were uploaded correctly by running:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mimirtool rules list \
|
||||||
|
--address=https://prometheus-us-central1.grafana.net \
|
||||||
|
--id=<yourID> \
|
||||||
|
--key=<yourKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
Output is a list that shows you all the namespaces and rule groups for your instance ID:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Namespace | Rule Group
|
||||||
|
first_rules | shopping_service_rules_and_alerts
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also print the rules:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mimirtool rules print \
|
||||||
|
--address=https://prometheus-us-central1.grafana.net \
|
||||||
|
--id=<yourID> \
|
||||||
|
--key=<yourKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
Output from the print command should look like this:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
first_rules:
|
||||||
|
- name: shopping_service_rules_and_alerts
|
||||||
|
interval: 0s
|
||||||
|
rules:
|
||||||
|
- alert: PromScrapeFailed
|
||||||
|
expr: up != 1
|
||||||
|
for: 1m
|
||||||
|
labels:
|
||||||
|
severity: critical
|
||||||
|
annotations:
|
||||||
|
message: Prometheus failed to scrape a target {{ $labels.job }} / {{ $labels.instance }}
|
||||||
|
- record: job:up:sum
|
||||||
|
expr: sum by(job) (up)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Upload Alertmanager configuration to your Grafana Cloud Alerts instance
|
||||||
|
|
||||||
|
To receive alerts you'll need to upload your Alertmanager configuration to your Grafana Cloud Alerts instance. Similar to the previous step, you'll need the corresponding instance ID, URL and API key. These should be part of /orgs/`<yourOrgName>`/.
|
||||||
|
|
||||||
|
Your Alerts instance is likely to be in the `us-central1` region. Its address would be in the form of [https://alertmanager-us-central1.grafana.net](https://alertmanager-us-central1.grafana.net).
|
||||||
|
|
||||||
|
### Using mimirtool
|
||||||
|
|
||||||
|
With your instance ID, URL, and API key you're now ready to upload your Alertmanager configuration to your Alerts instance. Use the following commands and files as a reference.
|
||||||
|
|
||||||
|
Ultimately, you'll need to [write your own](https://prometheus.io/docs/alerting/latest/configuration/) or adapt an [example config file](https://github.com/prometheus/alertmanager/blob/master/doc/examples/simple.yml) for alerts to be delivered.
|
||||||
|
|
||||||
|
Below is an example Alertmanager configuration. Please take that this not a working configuration, your alerts won't be delivered with the following configuration but your Alertmanager UI will be accessible.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# alertmanager.yml
|
||||||
|
global:
|
||||||
|
smtp_smarthost: 'localhost:25'
|
||||||
|
smtp_from: 'youraddress@example.org'
|
||||||
|
route:
|
||||||
|
receiver: example-email
|
||||||
|
receivers:
|
||||||
|
- name: example-email
|
||||||
|
email_configs:
|
||||||
|
- to: 'youraddress@example.org'
|
||||||
|
```
|
||||||
|
|
||||||
|
With this file, you can run the following commands to upload your Alertmanager configuration in your Alerts instance.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mimirtool alertmanager load alertmanager.yml \
|
||||||
|
--address=https://alertmanager-us-central1.grafana.net \
|
||||||
|
--id=<yourID> \
|
||||||
|
--key=<yourKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, confirm that the rules were uploaded correctly by running:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mimirtool alertmanager get \
|
||||||
|
--address=https://alertmanager-us-central1.grafana.net \
|
||||||
|
--id=<yourID> \
|
||||||
|
--key=<yourKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see output similar to the following:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
global:
|
||||||
|
smtp_smarthost: 'localhost:25'
|
||||||
|
smtp_from: 'youraddress@example.org'
|
||||||
|
route:
|
||||||
|
receiver: example-email
|
||||||
|
receivers:
|
||||||
|
- name: example-email
|
||||||
|
email_configs:
|
||||||
|
- to: 'youraddress@example.org'
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, you can delete the configuration with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mimirtool alertmanager delete \
|
||||||
|
--address=https://alertmanager-us-central1.grafana.net \
|
||||||
|
--id=<yourID> \
|
||||||
|
--key=<yourKey>
|
||||||
|
```
|
||||||
|
|
||||||
|
### UI access
|
||||||
|
|
||||||
|
After you upload a working Alertmanager configuration file, you can access the Alertmanager UI at: https://alertmanager-us-central1.grafana.net/alertmanager.
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/grafana-cloud-alerting/
|
||||||
|
- /docs/grafana-cloud/how-do-i/grafana-cloud-alerting/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/grafana-cloud-alerting/
|
||||||
|
description: Grafana Cloud Alerting
|
||||||
|
title: Grafana Cloud Alerting
|
||||||
|
weight: 100
|
||||||
|
---
|
||||||
|
|
||||||
|
# Grafana Cloud Alerting
|
||||||
|
|
||||||
|
Grafana Cloud Alerting allows you to create and manage all of your Prometheus-style alerting rules, for both Prometheus metrics and Loki log data. With this feature, you don't need to leave Grafana, upload or edit configuration files, or install additional tools.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Permissions
|
||||||
|
|
||||||
|
All members of an organization that have alerts set up can view alerts in Grafana Cloud Alerting. This includes everyone with a Viewer, Editor, or Admin role.
|
||||||
|
|
||||||
|
Users with the organization Admin role can also create, edit, or delete alerts.
|
||||||
|
|
||||||
|
## Data sources
|
||||||
|
|
||||||
|
Grafana Cloud Alerting supports rule management across multiple data sources, for both metrics and logs, across all of the stacks in your org. If you have more than one Prometheus or Loki data source, there will be a dropdown at the top for you to select the data source to configure rules.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Pay attention to which data source you select. Cloud alerts are tied to a specific data source. For example, if you have a Loki data source selected you will not be able to create an alert based on a Prometheus data source.
|
||||||
|

|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
## Alerts and recording rules
|
||||||
|
|
||||||
|
Prometheus supports two types of rules:
|
||||||
|
|
||||||
|
- [Recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/) - Recording rules allow you to execute expressions or queries, by saving them off as a stored rule instead.
|
||||||
|
- [Alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) - Alerting rules allow you to define alert conditions and to route those notifications to an external service. An alert fires if metrics meet criteria defined in the alerting rule.
|
||||||
|
|
||||||
|
Both of these rules are configurable from the Grafana Cloud Alerting interface and configured in the same way.
|
||||||
|
|
||||||
|
## Alert states
|
||||||
|
|
||||||
|
Alert states are identical to the standard format found in Prometheus rule configurations. In Grafana Cloud Alerting, each individual alert is highlighted by its state to more clearly distinguish between alerts.
|
||||||
|
|
||||||
|
- **Firing -** Alerts that have been active for longer than the configured threshold. Alerts are highlighted in red and tagged with a red `firing` label.
|
||||||
|
- **Pending -** Alerts that have been active for less than the configured threshold. Alerts are highlighted in orange.
|
||||||
|
- **Inactive -** Alerts that are neither firing nor pending. Alerts are highlighted in green.
|
||||||
|
|
||||||
|
## Notifications
|
||||||
|
|
||||||
|
The **Notifications** tab is where you can view all current notifications and sort them by various states, receivers, and labels.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Limits
|
||||||
|
|
||||||
|
There is a limit on how many rules can be created in a rule group. There is also a limit on how many rule groups can be created.
|
||||||
|
|
||||||
|
You can create:
|
||||||
|
|
||||||
|
- 20 rules per rule group
|
||||||
|
- 35 rule groups
|
||||||
|
|
||||||
|
> It is possible to increase these limits. Please contact customer support for further information.
|
||||||
|
|
||||||
|
If you exceed the limits, you will encounter an error similar to this:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ERROR[0000] requests failed fields.msg="request failed with response body
|
||||||
|
per-user rules per rule group limit (limit: 20 actual: 22) exceeded\n"
|
||||||
|
status="400 Bad Request"
|
||||||
|
ERROR[0000] unable to load rule group error="failed request to the cortex api"
|
||||||
|
group=limit_rules_per_group namespace=test
|
||||||
|
```
|
||||||
|
|
||||||
|
To increase the number of rules or rule groups you can configure, contact support to upgrade your account.
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/grafana-cloud-alerting/alertmanager/
|
||||||
|
- /docs/grafana-cloud/how-do-i/grafana-cloud-alerting/alertmanager/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/grafana-cloud-alerting/alertmanager/
|
||||||
|
description: Alertmanager
|
||||||
|
title: Alertmanager
|
||||||
|
weight: 500
|
||||||
|
---
|
||||||
|
|
||||||
|
# Alertmanager
|
||||||
|
|
||||||
|
Grafana Cloud Alerting allows you to edit and view configuration for your Alertmanager directly inside of Grafana. See the official [Alertmanager documentation](https://prometheus.io/docs/alerting/latest/configuration/) to learn how to configure.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Only organization Admins can view or update Alertmanger configurations.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
## Edit a config for Grafana Cloud Alerting
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Alertmanager**.
|
||||||
|
1. If you have more than one Alertmanager source, there will be a dropdown at the top for you to select the data source to edit configurations.
|
||||||
|
1. Currently active configuration for the Alertmanager will be displayed. Click the **Edit** button to enter edit mode and start making changes. Click "Save and finish editing" once done to persist your changes.
|
||||||
|
1. Alternatively, updates to the Alertmanager configurations made using the mimirtool will also sync and appear here.
|
||||||
|
|
||||||
|
## Use the Grafana Labs-supplied SMTP option to configure email notifications
|
||||||
|
|
||||||
|
Grafana Cloud users who do not have an SMTP server available for sending alert emails may use Grafana-Labs supplied SMTP relay (available at `smtprelay:2525`).
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Alertmanager**.
|
||||||
|
1. If you have more than one Alertmanager source, there will be a dropdown at the top for you to select the data source to edit configurations.
|
||||||
|
1. Find info box with heading **Send alert email notifications from Grafana Cloud** at the top
|
||||||
|
1. Enter desired email address into the **email address** field
|
||||||
|
1. Click **Update configuration** button. Alertmanager config will be updated with grafana SMTP relay settings and an "email" receiver that will send to the specified email address.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Following these steps will overwrite any custom global SMTP settings that you might have. Default route configuration will send all notifications to the "email" receiver. If you have already customized routes, they will not be updated and you will have to configure "email" receiver on the appropriate route.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
Use these settings in your Grafana Cloud Alerting YAML, if you do not find them already set. Most important is the `smtp_require_tls: false` line. If this is not set properly, alert emails will not be received. If you use mimirtool to configure alertmanager, by default this will be set to `true`, which will cause problems.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
global:
|
||||||
|
smtp_from: noreply@grafana.net
|
||||||
|
smtp_smarthost: smtprelay:2525
|
||||||
|
smtp_require_tls: false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting Alertmanager failures
|
||||||
|
|
||||||
|
Configuration errors can cause Alertmanager notification failures, e.g. a typo in an email address recipient or an expired token for a webhook. Grafana Cloud provisions a Loki datasource `grafanacloud-<stack_slug>-usage-insights` which can be used to display select notification errors with a query similar to the example below. The `instance_type` label of `alerts` is what selects the Grafana Cloud Alertmanager logs.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
{instance_type="alerts"} | logfmt | level="warn"
|
||||||
|
```
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/grafana-cloud-alerting/create-edit-rules/
|
||||||
|
- /docs/grafana-cloud/how-do-i/grafana-cloud-alerting/create-edit-rules/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/grafana-cloud-alerting/create-edit-rules/
|
||||||
|
description: Create and edit alert rules
|
||||||
|
title: Create and edit alert rules
|
||||||
|
weight: 200
|
||||||
|
---
|
||||||
|
|
||||||
|
# Create and edit alert rules
|
||||||
|
|
||||||
|
Creating alerts in Grafana Cloud differs from creating alerts directly with Prometheus or Loki. While the rule format is the same, everything is done in the Grafana Cloud Alerting interface, rather than with configuration files.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Only organization Admins can create or edit alert rules.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
## Create an alert rule
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Alerts and rules**.
|
||||||
|
1. If you have more than one Prometheus or Loki data source, there will be a dropdown at the top for you to select the data source to create or edit rules.
|
||||||
|
1. Click **Edit rules**.
|
||||||
|
1. Click **Add rule**.
|
||||||
|
|
||||||
|
Grafana creates a new rule with placeholders.
|
||||||
|
|
||||||
|
```
|
||||||
|
alert: ""
|
||||||
|
expr: ""
|
||||||
|
```
|
||||||
|
|
||||||
|
Enter text according to regular Prometheus rule configuration guidelines:
|
||||||
|
|
||||||
|
- [Recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)
|
||||||
|
- [Alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/)
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Grafana Cloud Alerting does not support comments.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
When you are finished, click **Save**. You can then repeat the process to create more rules or click **Finish editing** to return to the rules list.
|
||||||
|
|
||||||
|
## Edit an alert rule
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Alerts and rules**.
|
||||||
|
1. If you have more than one Prometheus or Loki data source, there will be a dropdown at the top for you to select the data source to create or edit rules.
|
||||||
|
1. Click **Edit rules**.
|
||||||
|
1. Scroll down to the rule that you want to edit and then click **Edit**.
|
||||||
|
1. Make any necessary changes to the rule text and then click **Save**.
|
||||||
|
1. Click **Finish editing** to return to the rules list.
|
||||||
|
|
||||||
|
## Delete an alert rule
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Alerts and rules**.
|
||||||
|
1. If you have more than one Prometheus or Loki data source, there will be a dropdown at the top for you to select the data source to create or edit rules.
|
||||||
|
1. Click **Edit rules**.
|
||||||
|
1. Scroll down to the rule that you want to edit and then click **Delete**.
|
||||||
|
1. Click **Finish editing** to return to the rules list.
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/grafana-cloud-alerting/namespaces-and-groups/
|
||||||
|
- /docs/grafana-cloud/how-do-i/grafana-cloud-alerting/namespaces-and-groups/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/grafana-cloud-alerting/namespaces-and-groups/
|
||||||
|
description: Namespaces and rule groups
|
||||||
|
title: Namespaces and rule groups
|
||||||
|
weight: 400
|
||||||
|
---
|
||||||
|
|
||||||
|
# Namespaces and rule groups
|
||||||
|
|
||||||
|
By default, all alerting and recording rules created in Grafana Cloud Alerting will default to a single namespace and a single rule group.
|
||||||
|
|
||||||
|
## Managing namespaces
|
||||||
|
|
||||||
|
While Grafana Cloud Alerting does support viewing multiple namespaces that have been added through the mimirtool, it is currently not possible to add new namespaces or to rename the existing ones.
|
||||||
|
|
||||||
|
## Managing rule groups
|
||||||
|
|
||||||
|
Rule groups can be managed directly within the Grafana Cloud Alerting interface or through the mimirtool, similar to managing namespaces.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
By default, Grafana Cloud limits the number of rule groups to 20, with a limit of up to 15 rules per group. If you wish to increase the default limits, please [open a support ticket](/profile/org#support) or reach out to your account manager.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
### Create a new rule group:
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Alerts and rules**.
|
||||||
|
2. If you have more than one Prometheus or Loki data source, there will be a dropdown at the top for you to select the data source to create or edit rules.
|
||||||
|
3. Click **Create new rule group**.
|
||||||
|
4. Enter text to name your new rule group.
|
||||||
|
5. Enter text for the new rule in your new rule group, according to regular Prometheus rule configuration guidelines:
|
||||||
|
|
||||||
|
- [Recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)
|
||||||
|
- [Alerting rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/)
|
||||||
|
|
||||||
|
6. When you are finished naming your new rule group and adding new rule details, click **Save**.
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
In order to create a new rule group, you must also create a new rule for it.
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
### Update a rule group
|
||||||
|
|
||||||
|
Existing rule groups can be renamed by selecting the **pencil** icon next to the rule group name.
|
||||||
|
|
||||||
|
### Delete a rule group
|
||||||
|
|
||||||
|
Rule groups will be automatically deleted once the all rules within a group are deleted.
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/grafana-cloud-alerting/silences/
|
||||||
|
- /docs/grafana-cloud/how-do-i/grafana-cloud-alerting/silences/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/grafana-cloud-alerting/silences/
|
||||||
|
description: Silences
|
||||||
|
title: Silences
|
||||||
|
weight: 600
|
||||||
|
---
|
||||||
|
|
||||||
|
# Silences
|
||||||
|
|
||||||
|
Grafana Cloud Alerting allows you to manage silences for your alertmanager notifications directly inside of Grafana. This applies to alerting rules created for both Prometheus metrics and Loki logs.
|
||||||
|
|
||||||
|
## Create a silence
|
||||||
|
|
||||||
|
1. In Grafana, hover your cursor over the **Grafana Cloud Alerting** icon and then click **Silences**.
|
||||||
|
2. Click **New silence**.
|
||||||
|
3. Enter a date in **Start of silence** to indicate when the silence should go into effect.
|
||||||
|
4. Enter a date in **End of silence** to indicate when the silence should expire.
|
||||||
|
5. Enter one or more matchers by filling out the **Name** and **Value** fields. Matchers determine which rules the silence will apply to.
|
||||||
|
6. Enter the name of the owner in **Creator**.
|
||||||
|
7. Enter a **Comment**.
|
||||||
|
8. To view which rules will be affected by your silence, click **Preview alerts**.
|
||||||
|
9. Otherwise, when you are finished, click **Create**
|
||||||
|
|
||||||
|
## Update an existing silence
|
||||||
|
|
||||||
|
You can always update an existing silence by clicking the **Edit silence** button under the silence.
|
||||||
|
|
||||||
|
It is also possible to expire a silence, on-demand, by clicking the **Expire silence** button under the silence. This will override the original scheduled expiration date of the silence.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- /docs/grafana-cloud/alerts/grafana-cloud-alerting/view-filter-rules/
|
||||||
|
- /docs/grafana-cloud/how-do-i/grafana-cloud-alerting/view-filter-alerts/
|
||||||
|
- /docs/grafana-cloud/legacy-alerting/grafana-cloud-alerting/view-filter-rules/
|
||||||
|
description: View and filter alert rules
|
||||||
|
title: View and filter alert rules
|
||||||
|
weight: 300
|
||||||
|
---
|
||||||
|
|
||||||
|
# View and filter alert rules
|
||||||
|
|
||||||
|
Grafana Cloud Alerting displays a list of all recording and alerting rules assigned to a selected data source in the Alerts and rules tab.
|
||||||
|
|
||||||
|
All members of an organization that have access to a particular data source can view the list of rules and filter or reorder their view.
|
||||||
|
|
||||||
|
## View alert rules
|
||||||
|
|
||||||
|
1. Hover your cursor over the **Grafana Cloud Alerting** icon (alarm bell with Prometheus logo) and then click **Alerts and rules**.
|
||||||
|
1. In the list at the top of the tab, select the data source for which you want to view rules.
|
||||||
|
|
||||||
|
Grafana displays rules according to rule groups. If your instance has added namespaces and alert groups, then they will be ordered alphabetically. Otherwise, you will have one namespace called `default` and an alert group called `rules`.
|
||||||
|
|
||||||
|
If an alert is firing, then click the down carrot arrow to see additional information. The Label and annotations section appears.
|
||||||
|
|
||||||
|
## Filter your alert rule view
|
||||||
|
|
||||||
|
You can control which alerts you see and in what order they appear several ways. Combine different filters to personalize your view so that you can quickly find the information that you need.
|
||||||
|
|
||||||
|
- **Filter by alert state -** Click the toggles to show or hide alerts in different states. Turn off the toggle to hide alerts matching the state.
|
||||||
|
- **Filter by rule type -** Click the toggles to show or hide alerting rules or recording rules.
|
||||||
|
- **View options -** Click the toggle to show or hide the Prometheus annotations shown in the Labels and annotations section.
|
||||||
|
- **Rule sorting -** Click an option to sort alert rules within each rule group.
|
||||||
|
- **None -** No special sort is applied and sorts as if in a file, ordered according to the editing list order.
|
||||||
|
- **A-Z -** Sorts rules alphabetically according to the rule name.
|
||||||
|
- **Alert state -** Sorts rules according to the alert state (Firing, Pending, or Inactive).
|
||||||
|
|
||||||
|
## View alert in Explore
|
||||||
|
|
||||||
|
Click **View in Explore** or click the `expr` link to open the `expr` in [Explore](/docs/grafana/latest/explore/).
|
||||||
|
|
||||||
|
> **Note:** Only users with Admin or Editor roles in an organization can use the Explore feature unless the viewers can edit.
|
||||||
@@ -20,18 +20,24 @@ 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).
|
||||||
|
|
||||||
|
7. Alerting on Prometheus `Both` type queries is not supported in Grafana Alerting. Existing legacy alerts with `Both` type queries are migrated to Grafana Alerting as alerts with `Range` type queries.
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
1. Since `Hipchat` and `Sensu` notification channels are no longer supported, legacy alerts associated with these channels are not automatically migrated to Grafana Alerting. Assign the legacy alerts to a supported notification channel so that you continue to receive notifications for those alerts.
|
1. Since `Hipchat` and `Sensu` notification channels are no longer supported, legacy alerts associated with these channels are not automatically migrated to Grafana Alerting. Assign the legacy alerts to a supported notification channel so that you continue to receive notifications for those alerts.
|
||||||
Silences (expiring after one year) are created for all paused dashboard alerts.
|
|
||||||
|
|||||||
@@ -47,4 +47,4 @@ Grafana cannot be used to receive external alerts. You can only send alerts to t
|
|||||||
|
|
||||||
You have the option to send Grafana managed alerts to an external Alertmanager, you can find this option in the admin tab on the Alerting page.
|
You have the option to send Grafana managed alerts to an external Alertmanager, you can find this option in the admin tab on the Alerting page.
|
||||||
|
|
||||||
For more information, refer to [this GitHub discussion](https://github.com/grafana/grafana/discussions/45773). For more information on the different Alertmanagers, refer to [Alertmanager]([{{< relref "../manage-notifications/alertmanager/" >}}](https://grafana.com/docs/grafana/next/alerting/manage-notifications/alertmanager/).
|
For more information, refer to [this GitHub discussion](https://github.com/grafana/grafana/discussions/45773).
|
||||||
|
|||||||
@@ -11,4 +11,4 @@ Configure the features and integrations that you need to create and manage your
|
|||||||
|
|
||||||
- [Configure Alertmanager](https://grafana.com/docs/grafana/latest/alerting/set-up/configure-alertmanager/)
|
- [Configure Alertmanager](https://grafana.com/docs/grafana/latest/alerting/set-up/configure-alertmanager/)
|
||||||
- [Provision Grafana Alerting resources](https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/)
|
- [Provision Grafana Alerting resources](https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/)
|
||||||
- [Connect Grafana Alerting to Grafana OnCall](https://grafana.com/docs/oncall/latest/integrations/available-integrations/add-grafana-alerting/)
|
- [Connect Grafana Alerting to Grafana OnCall](https://grafana.com/docs/oncall/latest/integrations/grafana-alerting/)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Since gossiping of notifications and silences uses both TCP and UDP port `9094`,
|
|||||||
|
|
||||||
1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the `[unified_alerting]` section.
|
1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the `[unified_alerting]` section.
|
||||||
2. Set `[ha_peers]` to the number of hosts for each Grafana instance in the cluster (using a format of host:port), for example, `ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094`.
|
2. Set `[ha_peers]` to the number of hosts for each Grafana instance in the cluster (using a format of host:port), for example, `ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094`.
|
||||||
You must have at least one (1) Grafana instance added to the [`[ha_peer]` section.
|
You must have at least one (1) Grafana instance added to the `ha_peers` section.
|
||||||
3. Set `[ha_listen_address]` to the instance IP address using a format of `host:port` (or the [Pod's](https://kubernetes.io/docs/concepts/workloads/pods/) IP in the case of using Kubernetes).
|
3. Set `[ha_listen_address]` to the instance IP address using a format of `host:port` (or the [Pod's](https://kubernetes.io/docs/concepts/workloads/pods/) IP in the case of using Kubernetes).
|
||||||
By default, it is set to listen to all interfaces (`0.0.0.0`).
|
By default, it is set to listen to all interfaces (`0.0.0.0`).
|
||||||
|
|
||||||
|
|||||||
@@ -24,22 +24,21 @@ There are three options to choose from:
|
|||||||
|
|
||||||
For more information on the Alerting Provisioning HTTP API, refer to [Alerting provisioning API](https://grafana.com/docs/grafana/latest/developers/http_api/alerting_provisioning/).
|
For more information on the Alerting Provisioning HTTP API, refer to [Alerting provisioning API](https://grafana.com/docs/grafana/latest/developers/http_api/alerting_provisioning/).
|
||||||
|
|
||||||
**Note:**
|
|
||||||
|
|
||||||
Typically, you cannot edit API-provisioned alert rules from the Grafana UI.
|
|
||||||
|
|
||||||
In order to enable editing, add the x-disable-provenance header to the following requests when creating or editing your alert rules in the API:
|
|
||||||
|
|
||||||
POST /api/v1/provisioning/alert-rules
|
|
||||||
|
|
||||||
PUT /api/v1/provisioning/alert-rules/{UID}
|
|
||||||
|
|
||||||
1. Provision your alerting resources using Terraform.
|
1. Provision your alerting resources using Terraform.
|
||||||
|
|
||||||
**Note:**
|
**Note:**
|
||||||
|
|
||||||
Currently, provisioning for Grafana Alerting supports alert rules, contact points, mute timings, and templates. Provisioned alerting resources using file provisioning or Terraform can only be edited in the source that created them and not from within Grafana or any other source. For example, if you provision your alerting resources using files from disk, you cannot edit the data in Terraform or from within Grafana.
|
Currently, provisioning for Grafana Alerting supports alert rules, contact points, mute timings, and templates. Provisioned alerting resources using file provisioning or Terraform can only be edited in the source that created them and not from within Grafana or any other source. For example, if you provision your alerting resources using files from disk, you cannot edit the data in Terraform or from within Grafana.
|
||||||
|
|
||||||
|
To allow editing of provisioned resources in the Grafana UI, add the `X-Disable-Provenance` header to the following requests in the API:
|
||||||
|
|
||||||
|
- `POST /api/v1/provisioning/alert-rules`
|
||||||
|
- `PUT /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}` (calling this endpoint will change provenance for all alert rules within the alert group)
|
||||||
|
- `POST /api/v1/provisioning/contact-points`
|
||||||
|
- `POST /api/v1/provisioning/mute-timings`
|
||||||
|
- `PUT /api/v1/provisioning/policies`
|
||||||
|
- `PUT /api/v1/provisioning/templates/{name}`
|
||||||
|
|
||||||
**Useful Links:**
|
**Useful Links:**
|
||||||
|
|
||||||
[Grafana provisioning](/docs/grafana/latest/administration/provisioning/)
|
[Grafana provisioning](/docs/grafana/latest/administration/provisioning/)
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ groups:
|
|||||||
# <string, required> which query should be used for the condition
|
# <string, required> which query should be used for the condition
|
||||||
condition: A
|
condition: A
|
||||||
# <list, required> list of query objects that should be executed on each
|
# <list, required> list of query objects that should be executed on each
|
||||||
# evaluation - should be obtained trough the API
|
# evaluation - should be obtained through the API
|
||||||
data:
|
data:
|
||||||
- refId: A
|
- refId: A
|
||||||
datasourceUid: '__expr__'
|
datasourceUid: '__expr__'
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ You cannot edit resources provisioned via Terraform from the UI. This ensures th
|
|||||||
|
|
||||||
**Note:**
|
**Note:**
|
||||||
|
|
||||||
You can re-use the same templates across many contact points. In the example above, a shared template ie embedded using the statement `{{ template “Alert Instance Template” . }}`
|
You can reuse the same templates across many contact points. In the example above, a shared template ie embedded using the statement `{{ template “Alert Instance Template” . }}`
|
||||||
|
|
||||||
This fragment can then be managed separately in Terraform:
|
This fragment can then be managed separately in Terraform:
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
title: Copyright notice
|
|
||||||
---
|
|
||||||
|
|
||||||
# Copyright notice
|
|
||||||
|
|
||||||
Copyright © 2021 Raintank, Inc. dba Grafana Labs. All Rights Reserved.
|
|
||||||
@@ -1,12 +1,6 @@
|
|||||||
---
|
---
|
||||||
aliases:
|
aliases:
|
||||||
- features/dashboard/dashboards/
|
- features/dashboard/dashboards/
|
||||||
cascade:
|
|
||||||
labels:
|
|
||||||
products:
|
|
||||||
- cloud
|
|
||||||
- enterprise
|
|
||||||
- oss
|
|
||||||
title: Dashboards
|
title: Dashboards
|
||||||
weight: 70
|
weight: 70
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -43,11 +43,9 @@ For every dashboard and data source, you can access usage information.
|
|||||||
|
|
||||||
### Dashboard insights
|
### Dashboard insights
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.0 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
To see dashboard usage information, click the dashboard insights icon in the header.
|
||||||
|
|
||||||
To see dashboard usage information, click **Dashboard insights** in the top bar.
|
{{< figure src="/media/docs/grafana/dashboards/screenshot-dashboard-insights.png" max-width="400px" class="docs-image--no-shadow" >}}
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/enterprise/dashboard_insights_button.png" max-width="400px" class="docs-image--no-shadow" >}}
|
|
||||||
|
|
||||||
Dashboard insights show the following information:
|
Dashboard insights show the following information:
|
||||||
|
|
||||||
@@ -58,8 +56,6 @@ Dashboard insights show the following information:
|
|||||||
|
|
||||||
### Data source insights
|
### Data source insights
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.3 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
|
||||||
|
|
||||||
Data source insights provides information about how a data source has been used in the past 30 days, such as:
|
Data source insights provides information about how a data source has been used in the past 30 days, such as:
|
||||||
|
|
||||||
- Queries per day
|
- Queries per day
|
||||||
@@ -68,17 +64,16 @@ Data source insights provides information about how a data source has been used
|
|||||||
|
|
||||||
To find data source insights:
|
To find data source insights:
|
||||||
|
|
||||||
1. Go to the Data source list view.
|
1. Click **Connections** in the main navigation.
|
||||||
1. Click on a data source.
|
1. Under Your connections, click **Data sources**.
|
||||||
|
1. Click a data source.
|
||||||
1. Click the **Insights** tab.
|
1. Click the **Insights** tab.
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/enterprise/datasource_insights.png" max-width="650px" class="docs-image--no-shadow" >}}
|
{{< figure src="/media/docs/grafana/dashboards/screenshot-data-source-insights-9.5.png" max-width="650px" class="docs-image--no-shadow" >}}
|
||||||
|
|
||||||
## Presence indicator
|
## Presence indicator
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.0 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
When you are signed in and looking at a dashboard, you can know who is looking at the same dashboard as you are via a presence indicator, which displays avatars of users who have recently interacted with the dashboard. The default time frame is 10 minutes. To see the user's name, hover over the user's avatar. The avatars come from [Gravatar](https://gravatar.com) based on the user's email.
|
||||||
|
|
||||||
When you are signed in and looking at a dashboard, you can know who is looking at the same dashboard as you are via a presence indicator, which displays avatars of users who have recently interacted with the dashboard. The default timeframe is 10 minutes. To see the user's name, hover over the user's avatar. The avatars come from [Gravatar](https://gravatar.com) based on the user's email.
|
|
||||||
|
|
||||||
When there are more active users on a dashboard than can fit within the presence indicator, click the **+X** icon. Doing so opens [dashboard insights]({{< relref "#dashboard-and-data-source-insights" >}}), which contains more details about recent user activity.
|
When there are more active users on a dashboard than can fit within the presence indicator, click the **+X** icon. Doing so opens [dashboard insights]({{< relref "#dashboard-and-data-source-insights" >}}), which contains more details about recent user activity.
|
||||||
|
|
||||||
@@ -88,29 +83,38 @@ To change _recent_ to something other than the past 10 minutes, edit the [config
|
|||||||
|
|
||||||
```ini
|
```ini
|
||||||
[analytics.views]
|
[analytics.views]
|
||||||
# Set age for recent active users
|
|
||||||
|
# Set age for recent active users to 10 minutes
|
||||||
recent_users_age = 10m
|
recent_users_age = 10m
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To disable the presence indicator, edit the [configuration][] file as follows:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[analytics.views]
|
||||||
|
|
||||||
|
|
||||||
|
# Disables the presence indicator
|
||||||
|
recent_users_age = 0
|
||||||
|
```
|
||||||
|
|
||||||
|
The dashboard won't show any avatars and thus no recent user activity.
|
||||||
|
|
||||||
## Sort dashboards by using insights data
|
## Sort dashboards by using insights data
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.0 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
In the search view, you can use insights data to help you find most-used, broken, and unused dashboards.
|
||||||
|
|
||||||
In the search view, you can use insights data to help you find most-used, broken, and unused dashbaords.
|
|
||||||
|
|
||||||
You can sort the dashboards by:
|
You can sort the dashboards by:
|
||||||
|
|
||||||
- Errors total
|
- Errors total
|
||||||
- Errors 30 days
|
- Errors 30 days (most and least)
|
||||||
- Views total
|
- Views total
|
||||||
- Views 30 days
|
- Views 30 days (most and least)
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/enterprise/improved-search-7-5.png" max-width="650px" class="docs-image--no-shadow" >}}
|
{{< figure src="/media/docs/grafana/dashboards/screenshot-dashboard-sort-9.5.png" max-width="650px" class="docs-image--no-shadow" >}}
|
||||||
|
|
||||||
## Visualize usage insights data
|
## Visualize usage insights data
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.0 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
|
||||||
|
|
||||||
If you set up your installation to [export logs of usage insights]({{< relref "../../setup-grafana/configure-security/export-logs/" >}}), we've created two dashboards to help you take advantage of this data.
|
If you set up your installation to [export logs of usage insights]({{< relref "../../setup-grafana/configure-security/export-logs/" >}}), we've created two dashboards to help you take advantage of this data.
|
||||||
|
|
||||||
1. [Usage Insights overview](/grafana/dashboards/13785) provides a top-level perspective of user activity.
|
1. [Usage Insights overview](/grafana/dashboards/13785) provides a top-level perspective of user activity.
|
||||||
|
|||||||
@@ -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 the 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
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,18 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee
|
|||||||
1. Click **Dashboards** in the left-side menu.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Click **New** and select **New Dashboard**.
|
1. Click **New** and select **New Dashboard**.
|
||||||
1. On the empty dashboard, click **+ Add visualization**.
|
1. On the empty dashboard, click **+ Add visualization**.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
1. In the first line of the **Query** tab, click the dropdown list and select a data source.
|
1. In the first line of the **Query** tab, click the dropdown list and select a data source.
|
||||||
1. Write or construct a query in the query language of your data source.
|
1. Write or construct a query in the query language of your data source.
|
||||||
|
|
||||||
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. Click the Refresh dashboard icon to query the data source.
|
||||||
|
|
||||||
|

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

|

|
||||||
@@ -49,9 +56,15 @@ 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. When you've finished editing your panel, click **Save** in the top right corner.
|
1. When you've finished editing your panel, click **Save** to save the dashboard.
|
||||||
|
|
||||||
|
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. Enter a name for your dashboard and select a folder, if applicable.
|
||||||
1. Click **Save**.
|
1. Click **Save**.
|
||||||
|
1. To add more panels to the dashboard, click **Add** in the dashboard header and select **Visualization** in the dropdown.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Configure repeating rows
|
## Configure repeating rows
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ When you create a library panel, the panel on the source dashboard is converted
|
|||||||
|
|
||||||
1. Open a panel in edit mode.
|
1. Open a panel in edit mode.
|
||||||
1. In the panel display options, click the down arrow option to bring changes to the visualization.
|
1. In the panel display options, click the down arrow option to bring changes to the visualization.
|
||||||
{{< figure src="/static/img/docs/library-panels/create-lib-panel-from-edit-8-0.png" class="docs-image--no-shadow" max-width= "800px" caption="Screenshot of the edit panel" >}}
|
{{< figure src="/media/docs/grafana/panels-visualizations/screenshot-create-lib-panel-from-edit-9-5.png" class="docs-image--no-shadow" max-width= "800px" >}}
|
||||||
1. Click the **Library panels** option, and then click **Create library panel** to open the create dialog.
|
1. Click **Library panels**, and then click **+ Create library panel** to open the create dialog.
|
||||||
1. In **Library panel name**, enter the name.
|
1. In **Library panel name**, enter the name.
|
||||||
1. In **Save in folder**, select the folder to save the library panel.
|
1. In **Save in folder**, select the folder to save the library panel.
|
||||||
1. Click **Create library panel** to save your changes.
|
1. Click **Create library panel** to save your changes.
|
||||||
@@ -34,14 +34,16 @@ When you create a library panel, the panel on the source dashboard is converted
|
|||||||
|
|
||||||
Once created, you can modify the library panel using any dashboard on which it appears. After you save the changes, all instances of the library panel reflect these modifications.
|
Once created, you can modify the library panel using any dashboard on which it appears. After you save the changes, all instances of the library panel reflect these modifications.
|
||||||
|
|
||||||
{{< figure src="/static/img/docs/library-panels/create-from-more-8-0.png" class="docs-image--no-shadow" max-width= "900px" caption="Screenshot of the edit panel" >}}
|
You can also create a library panel directly from the edit menu of any panel.
|
||||||
|
|
||||||
|
{{< figure src="/media/docs/grafana/panels-visualizations/screenshot-create-from-more-9-5.png" class="docs-image--no-shadow" max-width= "900px" >}}
|
||||||
|
|
||||||
## Add a library panel to a dashboard
|
## Add a library panel to a dashboard
|
||||||
|
|
||||||
Add a Grafana library panel to a dashboard when you want to provide visualizations to other dashboard users.
|
Add a Grafana library panel to a dashboard when you want to provide visualizations to other dashboard users.
|
||||||
|
|
||||||
1. Click **Dashboards** in the left-side menu.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Click **New** and select **New Dashboard**.
|
1. Click **New** and select **New Dashboard** in the dropdown.
|
||||||
1. On the empty dashboard, click **+ Import library panel**.
|
1. On the empty dashboard, click **+ Import library panel**.
|
||||||
|
|
||||||
You will see a list of your library panels.
|
You will see a list of your library panels.
|
||||||
@@ -60,6 +62,7 @@ Unlink a library panel when you want to make a change to the panel and not affec
|
|||||||
1. Hover over any part of the panel to display the actions menu on the top right corner.
|
1. Hover over any part of the panel to display the actions menu on the top right corner.
|
||||||
1. Click the menu and select **Edit**.
|
1. Click the menu and select **Edit**.
|
||||||
1. Click **Unlink** on the top right corner of the page.
|
1. Click **Unlink** on the top right corner of the page.
|
||||||
|
1. Click **Yes, unlink**.
|
||||||
|
|
||||||
## View a list of library panels
|
## View a list of library panels
|
||||||
|
|
||||||
@@ -69,7 +72,7 @@ You can view a list of available library panels and search for a library panel.
|
|||||||
1. Click **Library panels**.
|
1. Click **Library panels**.
|
||||||
|
|
||||||
You can see a list of previously defined library panels.
|
You can see a list of previously defined library panels.
|
||||||
{{< figure src="/static/img/docs/library-panels/library-panel-list-8-0.png" class="docs-image--no-shadow" max-width= "900px" caption="Screenshot of the edit panel" >}}
|
{{< figure src="/media/docs/grafana/panels-visualizations/screenshot-library-panel-list-9-5.png" class="docs-image--no-shadow" max-width= "900px" >}}
|
||||||
|
|
||||||
1. Search for a specific library panel if you know its name.
|
1. Search for a specific library panel if you know its name.
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ weight: 400
|
|||||||
|
|
||||||
Whenever you save a version of your dashboard, a copy of that version is saved so that previous versions of your dashboard are never lost. A list of these versions is available by entering the dashboard settings and then selecting "Versions" in the left side menu.
|
Whenever you save a version of your dashboard, a copy of that version is saved so that previous versions of your dashboard are never lost. A list of these versions is available by entering the dashboard settings and then selecting "Versions" in the left side menu.
|
||||||
|
|
||||||
<img class="no-shadow" src="/static/img/docs/v50/dashboard_versions_list.png">
|

|
||||||
|
|
||||||
The dashboard version history feature lets you compare and restore to previously saved dashboard versions.
|
The dashboard version history feature lets you compare and restore to previously saved dashboard versions.
|
||||||
|
|
||||||
@@ -25,20 +25,18 @@ The dashboard version history feature lets you compare and restore to previously
|
|||||||
|
|
||||||
To compare two dashboard versions, select the two versions from the list that you wish to compare. Once selected, the "Compare versions" button will become clickable. Click the button to view the diff between the two versions.
|
To compare two dashboard versions, select the two versions from the list that you wish to compare. Once selected, the "Compare versions" button will become clickable. Click the button to view the diff between the two versions.
|
||||||
|
|
||||||
<img class="no-shadow" src="/static/img/docs/v50/dashboard_versions_select.png">
|

|
||||||
|
|
||||||
Upon clicking the button, you'll be brought to the diff view. By default, you'll see a textual summary of the changes, like in the image below.
|
Upon clicking the button, you'll be brought to the diff view. By default, you'll see a textual summary of the changes, like in the image below.
|
||||||
|
|
||||||
<img class="no-shadow" src="/static/img/docs/v50/dashboard_versions_diff_basic.png">
|

|
||||||
|
|
||||||
If you want to view the diff of the raw JSON that represents your dashboard, you can do that as well by clicking the "View JSON Diff" button at the bottom.
|
If you want to view the diff of the raw JSON that represents your dashboard, you can do that as well by clicking the expand icon for the View JSON Diff section at the bottom.
|
||||||
|
|
||||||
If you want to restore to the version you are diffing against, you can do so by clicking the "Restore to version \<x\>" button in the top right.
|
|
||||||
|
|
||||||
## Restoring to a previously saved dashboard version
|
## Restoring to a previously saved dashboard version
|
||||||
|
|
||||||
If you need to restore to a previously saved dashboard version, you can do so by either clicking the "Restore" button on the right of a row in the dashboard version list, or by clicking the "Restore to version \<x\>" button appearing in the diff view. Clicking the button will bring up the following popup prompting you to confirm the restoration.
|
If you need to restore to a previously saved dashboard version, you can do so by either clicking the "Restore" button on the right of a row in the dashboard version list, or by clicking the **Restore to version \<x\>** button appearing in the diff view. Clicking the button will bring up the following popup prompting you to confirm the restoration.
|
||||||
|
|
||||||
<img class="no-shadow" src="/static/img/docs/v50/dashboard_versions_restore.png">
|

|
||||||
|
|
||||||
After restoring to a previous version, a new version will be created containing the same exact data as the previous version, only with a different version number. This is indicated in the "Notes column" for the row in the new dashboard version. This is done simply to ensure your previous dashboard versions are not affected by the change.
|
After restoring to a previous version, a new version will be created containing the same exact data as the previous version, only with a different version number. This is indicated in the "Notes column" for the row in the new dashboard version. This is done simply to ensure your previous dashboard versions are not affected by the change.
|
||||||
|
|||||||
@@ -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**.
|
||||||
|
|||||||
@@ -26,21 +26,22 @@ Use the information in this section to access existing playlists. Start and cont
|
|||||||
|
|
||||||
### Access a playlist
|
### Access a playlist
|
||||||
|
|
||||||
1. Hover your cursor over Grafana’s side menu.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Click **Playlists**. You will see a list of existing playlists.
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
|
|
||||||
### Start a playlist
|
### Start a playlist
|
||||||
|
|
||||||
You can start a playlist in five different view modes. View mode determine how the menus and navigation bar appear on the dashboards.
|
You can start a playlist in five different view modes. View modes determine how the menus and navigation bar appear on the dashboards.
|
||||||
|
|
||||||
By default, each dashboard is displayed for the amount of time entered in the Interval field, which you set when you create or edit a playlist. After you start a playlist, you can control it with the navbar at the top of the page.
|
By default, each dashboard is displayed for the amount of time entered in the Interval field, which you set when you create or edit a playlist. After you start a playlist, you can control it with the navbar at the top of the page.
|
||||||
|
|
||||||
1. [Access](#access-playlist) the playlist page to see a list of existing playlists.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Find the playlist you want to start, then click **Start playlist**. The start playlist dialog opens.
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
1. Select one of the five playlist modes available based on the information in the following table.
|
1. Find the playlist you want to start, then click **Start playlist**.
|
||||||
1. Click **Start <playlist name>**.
|
1. In the modal that opens, select one of the five playlist modes available, based on the information in the table below.
|
||||||
|
1. Click **Start \<playlist name\>**.
|
||||||
|
|
||||||
The playlist displays each dashboard for the time specified in the `Interval` field, set when creating or editing a playlist. Once a playlist starts, you can [control](#control-a-playlist) it using the navbar at the top of your screen.
|
The playlist displays each dashboard for the time specified in the **Interval** field, set when creating or editing a playlist. Once a playlist starts, you can [control](#control-a-playlist) it using the navbar at the top of your screen.
|
||||||
|
|
||||||
| Mode | Description |
|
| Mode | Description |
|
||||||
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
@@ -67,7 +68,9 @@ You can control a playlist in **Normal** or **TV** mode after it's started, usin
|
|||||||
|
|
||||||
You can create a playlist to present dashboards in a sequence, with a set order and time interval between dashboards.
|
You can create a playlist to present dashboards in a sequence, with a set order and time interval between dashboards.
|
||||||
|
|
||||||
1. In the playlist page, click **New playlist**. The New playlist page opens.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
|
1. Click **New playlist**. The New playlist page opens.
|
||||||
1. In the **Name** text box, enter a descriptive name.
|
1. In the **Name** text box, enter a descriptive name.
|
||||||
1. In the **Interval** text box, enter a time interval. Grafana displays a particular dashboard for the interval of time specified here before moving on to the next dashboard.
|
1. In the **Interval** text box, enter a time interval. Grafana displays a particular dashboard for the interval of time specified here before moving on to the next dashboard.
|
||||||
1. In Dashboards, add existing dashboards to the playlist using **Add by title** and **Add by tag** drop-down options. The dashboards you add are listed in a sequential order.
|
1. In Dashboards, add existing dashboards to the playlist using **Add by title** and **Add by tag** drop-down options. The dashboards you add are listed in a sequential order.
|
||||||
@@ -82,8 +85,8 @@ You can create a playlist to present dashboards in a sequence, with a set order
|
|||||||
|
|
||||||
You can save a playlist and add it to your **Playlists** page, where you can start it. Be sure that all the dashboards you want to appear in your playlist are added when creating or editing the playlist before saving it.
|
You can save a playlist and add it to your **Playlists** page, where you can start it. Be sure that all the dashboards you want to appear in your playlist are added when creating or editing the playlist before saving it.
|
||||||
|
|
||||||
1. To access the Playlist feature, hover your cursor over Grafana's side menu.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Click **Playlists**.
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
1. Click on the playlist.
|
1. Click on the playlist.
|
||||||
1. Edit the playlist.
|
1. Edit the playlist.
|
||||||
1. Ensure that your playlist has a **Name**, **Interval**, and at least one **Dashboard** added to it.
|
1. Ensure that your playlist has a **Name**, **Interval**, and at least one **Dashboard** added to it.
|
||||||
@@ -95,36 +98,47 @@ You can edit a playlist by updating its name, interval time, and by adding, remo
|
|||||||
|
|
||||||
### Edit a playlist
|
### Edit a playlist
|
||||||
|
|
||||||
1. In the playlist page, click **Edit playlist**. The Edit playlist page opens.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
|
1. Find the playlist you want to update and click **Edit playlist**.
|
||||||
1. Update the name and time interval, then add or remove dashboards from the playlist using instructions in [Create a playlist](#create-a-playlist).
|
1. Update the name and time interval, then add or remove dashboards from the playlist using instructions in [Create a playlist](#create-a-playlist).
|
||||||
1. Click **Save** to save your changes.
|
1. Click **Save** to save your changes.
|
||||||
|
|
||||||
### Delete a playlist
|
### Delete a playlist
|
||||||
|
|
||||||
1. Click **Playlists**.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Next to the Playlist you want to delete, click **Remove[x]**.
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
|
1. Find the playlist you want to remove.
|
||||||
|
1. Click **Delete playlist**.
|
||||||
|
|
||||||
### Rearrange dashboard order
|
### Rearrange dashboard order
|
||||||
|
|
||||||
1. Next to the dashboard you want to move, click the up or down arrow.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
|
1. Find the playlist you want to update and click **Edit playlist**.
|
||||||
|
1. Click and drag the dashboards into your desired order.
|
||||||
1. Click **Save** to save your changes.
|
1. Click **Save** to save your changes.
|
||||||
|
|
||||||
### Remove a dashboard
|
### Remove a dashboard
|
||||||
|
|
||||||
1. Click **Remove[x]** to remove a dashboard from the playlist.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
|
1. Find the playlist you want to update and click **Edit playlist**.
|
||||||
|
1. Click **\[x\]** on the name of the dashboard you want to remove from the playlist.
|
||||||
1. Click **Save** to save your changes.
|
1. Click **Save** to save your changes.
|
||||||
|
|
||||||
## Share a playlist in a view mode
|
## Share a playlist in a view mode
|
||||||
|
|
||||||
You can share a playlist by copying the link address on the view mode you prefer, and pasting the URL to your destination.
|
You can share a playlist by copying the link address on the view mode you prefer, and pasting the URL to your destination.
|
||||||
|
|
||||||
1. From the Dashboards submenu, click **Playlists**.
|
1. Click **Dashboards** in the left-side menu.
|
||||||
1. Next to the playlist you want to share, click **Start playlist**.
|
1. Click **Playlists** to see a list of existing playlists.
|
||||||
1. In the dropdown, right click the view mode you prefer.
|
1. Click the share icon of the playlist you want to share.
|
||||||
1. Click **Copy Link Address** to copy the URL to your clipboard.
|
1. Select the view mode you prefer.
|
||||||
|
1. Click **Copy** next to the Link URL to copy it to your clipboard.
|
||||||
|
|
||||||
Example: The URL for the first playlist on the Grafana Play site in Kiosk mode will look like this:
|
For example, the URL for the first playlist on the Grafana Play site in Kiosk mode will look like this:
|
||||||
|
|
||||||
[https://play.grafana.org/playlists/play/1?kiosk](https://play.grafana.org/playlists/play/1?kiosk).
|
[https://play.grafana.org/playlists/play/1?kiosk](https://play.grafana.org/playlists/play/1?kiosk).
|
||||||
|
|
||||||
1. Paste the URL to your destination.
|
1. Paste the URL to your destination.
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ keywords:
|
|||||||
- reporting
|
- reporting
|
||||||
- export
|
- export
|
||||||
- pdf
|
- pdf
|
||||||
|
labels:
|
||||||
|
products:
|
||||||
|
- cloud
|
||||||
|
- enterprise
|
||||||
menuTitle: Reporting
|
menuTitle: Reporting
|
||||||
title: Create and manage reports
|
title: Create and manage reports
|
||||||
weight: 85
|
weight: 85
|
||||||
@@ -26,7 +30,7 @@ Reporting enables you to automatically generate PDFs from any of your dashboards
|
|||||||
{{< figure src="/static/img/docs/enterprise/reports_list_8.1.png" max-width="500px" >}}
|
{{< figure src="/static/img/docs/enterprise/reports_list_8.1.png" max-width="500px" >}}
|
||||||
-->
|
-->
|
||||||
|
|
||||||
Any changes you make to a dashboard used in a report are reflected the next time the report is sent. For example, if you change the time range in the dashboard, then the time range in the report also changes.
|
Any changes you make to a dashboard used in a report are reflected the next time the report is sent. For example, if you change the time range in the dashboard, then the time range in the report also changes, unless you've configured a custom time range.
|
||||||
|
|
||||||
For information about recent improvements to the reporting UI, refer to [Grafana reporting: How we improved the UX in Grafana](https://grafana.com/blog/2022/06/29/grafana-reporting-how-we-improved-the-ux-in-grafana/).
|
For information about recent improvements to the reporting UI, refer to [Grafana reporting: How we improved the UX in Grafana](https://grafana.com/blog/2022/06/29/grafana-reporting-how-we-improved-the-ux-in-grafana/).
|
||||||
|
|
||||||
@@ -43,10 +47,11 @@ When [RBAC]({{< relref "../../administration/roles-and-permissions/access-contro
|
|||||||
|
|
||||||
Only organization administrators can create reports by default. You can customize who can create reports with [Role-based access control]({{< relref "../../administration/roles-and-permissions/access-control/" >}}).
|
Only organization administrators can create reports by default. You can customize who can create reports with [Role-based access control]({{< relref "../../administration/roles-and-permissions/access-control/" >}}).
|
||||||
|
|
||||||
1. Click on the Reports icon in the side navigation menu.
|
1. Click **Dashboards > Reports** in the side navigation menu.
|
||||||
|
|
||||||
The Reports tab allows you to view, create, and update your reports. The report form has a multi-step layout. The steps do not need to be completed in succession and can be skipped over by clicking a step name.
|
The Reports page allows you to view, create, and update your reports. The report form has a multi-step layout. The steps do not need to be completed in succession and can be skipped over by clicking a step name.
|
||||||
|
|
||||||
|
1. Click **+ Create a new report**.
|
||||||
1. Select report dashboard.
|
1. Select report dashboard.
|
||||||
- **Source dashboard:** Select the dashboard from which you want to generate the report.
|
- **Source dashboard:** Select the dashboard from which you want to generate the report.
|
||||||
- **Time range:** (optional) Use custom time range for the report. For more information, refer to [Report time range]({{< relref "#report-time-range" >}}).
|
- **Time range:** (optional) Use custom time range for the report. For more information, refer to [Report time range]({{< relref "#report-time-range" >}}).
|
||||||
@@ -68,6 +73,14 @@ Only organization administrators can create reports by default. You can customiz
|
|||||||
- **Send test email:** To verify that the configuration works as expected. You can choose to send this email to the recipients configured for the report, or to a different set of email addresses only used for testing.
|
- **Send test email:** To verify that the configuration works as expected. You can choose to send this email to the recipients configured for the report, or to a different set of email addresses only used for testing.
|
||||||
1. Preview and save the report.
|
1. Preview and save the report.
|
||||||
|
|
||||||
|
### Save as draft
|
||||||
|
|
||||||
|
{{% admonition type="note" %}}
|
||||||
|
Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 9.1.0 and later and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
You can save a report as a draft at any point during the report creation or update process. You can save a report as a draft even if it's missing required fields. Also, the report won't be sent according to its schedule while it's a draft.
|
||||||
|
|
||||||
### Choose template variables
|
### Choose template variables
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.5 and later behind the `reportVariables` feature flag, Grafana Enterprise version 8.0 and later without a feature flag, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.5 and later behind the `reportVariables` feature flag, Grafana Enterprise version 8.0 and later without a feature flag, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
||||||
@@ -183,7 +196,7 @@ You can generate and save PDF files of any dashboard.
|
|||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 6.7 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 6.7 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
||||||
|
|
||||||
1. In the upper-right corner of the dashboard that you want to export as PDF, click the **Share dashboard** icon.
|
1. In the dashboard that you want to export as PDF, click the **Share dashboard** icon.
|
||||||
1. On the PDF tab, select a layout option for the exported dashboard: **Portrait** or **Landscape**.
|
1. On the PDF tab, select a layout option for the exported dashboard: **Portrait** or **Landscape**.
|
||||||
1. Click **Save as PDF** to render the dashboard as a PDF file.
|
1. Click **Save as PDF** to render the dashboard as a PDF file.
|
||||||
|
|
||||||
@@ -230,7 +243,7 @@ font_italic = DejaVuSansCondensed-Oblique.ttf
|
|||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.2 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) version 7.2 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
|
||||||
|
|
||||||
You can configure organization-wide report settings in the **Settings** tab on the **Reporting** page. Settings are applied to all the reports for current organization.
|
You can configure organization-wide report settings in the **Settings** under **Dashboards > Reporting**. Settings are applied to all the reports for current organization.
|
||||||
|
|
||||||
You can customize the branding options.
|
You can customize the branding options.
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,13 @@ weight: 8
|
|||||||
|
|
||||||
# Public dashboards
|
# Public dashboards
|
||||||
|
|
||||||
> **Note:** This is an opt-in alpha feature.
|
{{% admonition type="note" %}}
|
||||||
|
|
||||||
> **Caution:** Making your dashboard public could result in a large number of queries to the datasources used by your dashboard.
|
This feature is experimental.
|
||||||
|
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
|
> **Caution:** Making your dashboard public could result in a large number of queries to the data sources used by your dashboard.
|
||||||
> This can be mitigated by utilizing the enterprise [caching](https://grafana.com/docs/grafana/latest/enterprise/query-caching/) and/or rate limiting features.
|
> This can be mitigated by utilizing the enterprise [caching](https://grafana.com/docs/grafana/latest/enterprise/query-caching/) and/or rate limiting features.
|
||||||
|
|
||||||
Public dashboards allow you to share your Grafana dashboard with anyone. This is useful when you want to expose your
|
Public dashboards allow you to share your Grafana dashboard with anyone. This is useful when you want to expose your
|
||||||
@@ -20,7 +24,7 @@ dashboard to the world.
|
|||||||
|
|
||||||
- Anyone with the URL can access the dashboard.
|
- Anyone with the URL can access the dashboard.
|
||||||
- Public dashboards are read-only.
|
- Public dashboards are read-only.
|
||||||
- Arbitrary queries **cannot** be run against your datasources through public dashboards. Public dashboards can only execute the
|
- Arbitrary queries **cannot** be run against your data sources through public dashboards. Public dashboards can only execute the
|
||||||
queries stored on the original dashboard.
|
queries stored on the original dashboard.
|
||||||
|
|
||||||
## Enable the feature
|
## Enable the feature
|
||||||
@@ -66,21 +70,16 @@ The link no longer works. You must create a new public URL as in [Make a dashboa
|
|||||||
|
|
||||||
## Email sharing
|
## Email sharing
|
||||||
|
|
||||||
> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud).
|
{{% admonition type="note" %}}
|
||||||
|
|
||||||
|
This feature is experimental in [Grafana Cloud Pro and Advanced](/docs/grafana-cloud). The feature will have a cost by active users after being promoted into general availability.
|
||||||
|
|
||||||
|
Please contact support to have the feature enabled.
|
||||||
|
|
||||||
|
{{% /admonition %}}
|
||||||
|
|
||||||
Email sharing allows you to share your public dashboard with only specific people via email, instead of having it accessible to anyone with the URL.
|
Email sharing allows you to share your public dashboard with only specific people via email, instead of having it accessible to anyone with the URL.
|
||||||
|
|
||||||
### Enable email sharing
|
|
||||||
|
|
||||||
> **Note:** For Grafana Cloud, contact support to have the feature enabled.
|
|
||||||
|
|
||||||
Add the `publicDashboardsEmailSharing` feature toggle to your `custom.ini` file.
|
|
||||||
|
|
||||||
```
|
|
||||||
[feature_toggles]
|
|
||||||
publicDashboardsEmailSharing = true
|
|
||||||
```
|
|
||||||
|
|
||||||
### Invite a viewer
|
### Invite a viewer
|
||||||
|
|
||||||
1. Click the sharing icon to the right of the dashboard title.
|
1. Click the sharing icon to the right of the dashboard title.
|
||||||
@@ -158,7 +157,7 @@ guaranteed because plugin developers can override this functionality. The follow
|
|||||||
|
|
||||||
### Unconfirmed:
|
### Unconfirmed:
|
||||||
|
|
||||||
> **Note:** If you've confirmed one of these datasources work with public dashboards, let us know in our [Github](https://github.com/grafana/grafana/discussions/49253) discussion, and we'll mark it as confirmed!
|
> **Note:** If you've confirmed one of these data sources work with public dashboards, let us know in our [Github](https://github.com/grafana/grafana/discussions/49253) discussion, and we'll mark it as confirmed!
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -220,14 +219,14 @@ guaranteed because plugin developers can override this functionality. The follow
|
|||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
- Panels that use frontend datasources will fail to fetch data.
|
- Panels that use frontend data sources will fail to fetch data.
|
||||||
- Template variables are currently not supported, but are planned to be in the future.
|
- Template variables are currently not supported, but are planned to be in the future.
|
||||||
- Exemplars will be omitted from the panel.
|
- Exemplars will be omitted from the panel.
|
||||||
- Only annotations that query the `-- Grafana --` datasource are supported.
|
- Only annotations that query the `-- Grafana --` data source are supported.
|
||||||
- Organization annotations are not supported.
|
- Organization annotations are not supported.
|
||||||
- Grafana Live and real-time event streams are not supported.
|
- Grafana Live and real-time event streams are not supported.
|
||||||
- Library panels are currently not supported, but are planned to be in the future.
|
- Library panels are currently not supported, but are planned to be in the future.
|
||||||
- Datasources using Reverse Proxy functionality are not supported.
|
- Data sources using Reverse Proxy functionality are not supported.
|
||||||
|
|
||||||
We are excited to share this enhancement with you and we’d love your feedback! Please check out the [Github](https://github.com/grafana/grafana/discussions/49253) discussion and join the conversation.
|
We are excited to share this enhancement with you and we’d love your feedback! Please check out the [Github](https://github.com/grafana/grafana/discussions/49253) discussion and join the conversation.
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user