diff --git a/dbm-services/go.work b/dbm-services/go.work index 92dc9b4e67..1d5c2dba71 100644 --- a/dbm-services/go.work +++ b/dbm-services/go.work @@ -2,6 +2,7 @@ go 1.19 use ( riak/db-tools/dbactuator + riak/db-tools/riak-monitor bigdata/db-tools/dbactuator common/db-config common/db-resource diff --git a/dbm-services/go.work.sum b/dbm-services/go.work.sum index 213d477117..19ee46992d 100644 --- a/dbm-services/go.work.sum +++ b/dbm-services/go.work.sum @@ -4,52 +4,79 @@ cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/accessapproval v1.5.0 h1:/nTivgnV/n1CaAeo+ekGexTYUsKEU9jUVkoY5359+3Q= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= cloud.google.com/go/accesscontextmanager v1.4.0 h1:CFhNhU7pcD11cuDkQdrE6PQJgv0EXNKNv06jIzbLlCU= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/aiplatform v1.27.0 h1:DBi3Jk9XjCJ4pkkLM4NqKgj3ozUL1wq4l+d3/jTGXAI= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/analytics v0.12.0 h1:NKw6PpQi6V1O+KsjuTd+bhip9d0REYu4NevC45vtGp8= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= cloud.google.com/go/apigateway v1.4.0 h1:IIoXKR7FKrEAQhMTz5hK2wiDz2WNFHS7eVr/L1lE/rM= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= cloud.google.com/go/apigeeconnect v1.4.0 h1:AONoTYJviyv1vS4IkvWzq69gEVdvHx35wKXc+e6wjZQ= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.5.0 h1:lmG+O5oaR9xNwaRBwE2XoMhwQHsHql5IoiGr1ptdDwU= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/area120 v0.6.0 h1:TCMhwWEWhCn8d44/Zs7UCICTWje9j3HuV6nVGMjdpYw= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/artifactregistry v1.9.0 h1:3d0LRAU1K6vfqCahhl9fx2oGHcq+s5gftdix4v8Ibrc= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/asset v1.10.0 h1:aCrlaLGJWTODJX4G56ZYzJefITKEWNfbjjtHSzWpxW0= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/assuredworkloads v1.9.0 h1:hhIdCOowsT1GG5eMCIA0OwK6USRuYTou/1ZeNxCSRtA= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/automl v1.8.0 h1:BMioyXSbg7d7xLibn47cs0elW6RT780IUWr42W8rp2Q= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= cloud.google.com/go/baremetalsolution v0.4.0 h1:g9KO6SkakcYPcc/XjAzeuUrEOXlYPnMpuiaywYaGrmQ= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/batch v0.4.0 h1:1jvEBY55OH4Sd2FxEXQfxGExFWov1A/IaRe+Z5Z71Fw= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/beyondcorp v0.3.0 h1:w+4kThysgl0JiKshi2MKDCg2NZgOyqOI0wq2eBZyrzA= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.44.0 h1:Wi4dITi+cf9VYp4VH2T9O41w0kCW0uQTELq2Z6tukN0= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/billing v1.7.0 h1:Xkii76HWELHwBtkQVZvqmSo9GTr0O+tIbRNnMcGdlg4= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/binaryauthorization v1.4.0 h1:pL70vXWn9TitQYXBWTK2abHl2JHLwkFRjYw6VflRqEA= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= cloud.google.com/go/certificatemanager v1.4.0 h1:tzbR4UHBbgsewMWUD93JHi8EBi/gHBoSAcY1/sThFGk= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= cloud.google.com/go/channel v1.9.0 h1:pNuUlZx0Jb0Ts9P312bmNMuH5IiFWIR4RUtLb70Ke5s= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= cloud.google.com/go/cloudbuild v1.4.0 h1:TAAmCmAlOJ4uNBu6zwAjwhyl/7fLHHxIEazVhr3QBbQ= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= cloud.google.com/go/clouddms v1.4.0 h1:UhzHIlgFfMr6luVYVNydw/pl9/U5kgtjCMJHnSvoVws= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/cloudtasks v1.8.0 h1:faUiUgXjW8yVZ7XMnKHKm1WE4OldPBUWWfIRN/3z1dc= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -61,205 +88,302 @@ cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.4.0 h1:tTQLI/ZvguUf9Hv+36BkG2+/PeC8Ol1q4pBW+tgCx0A= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/container v1.7.0 h1:nbEK/59GyDRKKlo1SqpohY1TK8LmJ2XNcvS9Gyom2A0= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/containeranalysis v0.6.0 h1:2824iym832ljKdVpCBnpqm5K94YT/uHTVhNF+dRTXPI= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/datacatalog v1.8.0 h1:6kZ4RIOW/uT7QWC5SfPfq/G8sYzr/v+UOmOAxy4Z1TE= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/dataflow v0.7.0 h1:CW3541Fm7KPTyZjJdnX6NtaGXYFn5XbFC5UcjgALKvU= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataform v0.5.0 h1:vLwowLF2ZB5J5gqiZCzv076lDI/Rd7zYQQFu5XO1PSg= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= cloud.google.com/go/datafusion v1.5.0 h1:j5m2hjWovTZDTQak4MJeXAR9yN7O+zMfULnjGw/OOLg= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datalabeling v0.6.0 h1:dp8jOF21n/7jwgo/uuA0RN8hvLcKO4q6s/yvwevs2ZM= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= cloud.google.com/go/dataplex v1.4.0 h1:cNxeA2DiWliQGi21kPRqnVeQ5xFhNoEjPRt1400Pm8Y= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= cloud.google.com/go/dataproc v1.8.0 h1:gVOqNmElfa6n/ccG/QDlfurMWwrK3ezvy2b2eDoCmS0= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.6.0 h1:gx9jr41ytcA3dXkbbd409euEaWtofCVXYBvJz3iYm18= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.10.0 h1:4siQRf4zTiAVt/oeH4GureGkApgb2vtPQAtOmhpqQwE= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastream v1.5.0 h1:PgIgbhedBtYBU6POGXFMn2uSl9vpqubc3ewTNdcU8Mk= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= cloud.google.com/go/deploy v1.5.0 h1:kI6dxt8Ml0is/x7YZjLveTvR7YPzXAUD/8wQZ2nH5zA= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/dialogflow v1.19.0 h1:HYHVOkoxQ9bSfNIelSZYNAtUi4CeSrCnROyOsbOqPq8= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= cloud.google.com/go/dlp v1.7.0 h1:9I4BYeJSVKoSKgjr70fLdRDumqcUeVmHV4fd5f9LR6Y= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/documentai v1.10.0 h1:jfq09Fdjtnpnmt/MLyf6A3DM3ynb8B2na0K+vSXvpFM= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/domains v0.7.0 h1:pu3JIgC1rswIqi5romW0JgNO6CTUydLYX8zyjiAvO1c= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/edgecontainer v0.2.0 h1:hd6J2n5dBBRuAqnNUEsKWrp6XNPKsaxwwIyzOPZTokk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.4.0 h1:b6csrQXCHKQmfo9h3dG/pHyoEh+fQG1Yg78a53LAviY= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= cloud.google.com/go/eventarc v1.8.0 h1:AgCqrmMMIcel5WWKkzz5EkCUKC3Rl5LNMMYsS+LvsI0= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= cloud.google.com/go/filestore v1.4.0 h1:yjKOpzvqtDmL5AXbKttLc8j0hL20kuC1qPdy5HPcxp0= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.9.0 h1:35tgv1fQOtvKqH/uxJMzX3w6usneJ0zXpsFr9KAVhNE= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/gaming v1.8.0 h1:97OAEQtDazAJD7yh/kvQdSCQuTKdR0O+qWAJBZJ4xiA= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= cloud.google.com/go/gkebackup v0.3.0 h1:4K+jiv4ocqt1niN8q5Imd8imRoXBHTrdnJVt/uFFxF4= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.6.0 h1:zAcvDa04tTnGdu6TEZewaLN2tdMtUOJJ7fEceULjguA= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkehub v0.10.0 h1:JTcTaYQRGsVm+qkah7WzHb6e9sf1C0laYdRPn9aN+vg= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= cloud.google.com/go/gkemulticloud v0.4.0 h1:8F1NhJj8ucNj7lK51UZMtAjSWTgP1zO18XF6vkfiPPU= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= cloud.google.com/go/gsuiteaddons v1.4.0 h1:TGT2oGmO5q3VH6SjcrlgPUWI0njhYv4kywLm6jag0to= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iap v1.5.0 h1:BGEXovwejOCt1zDk8hXq0bOhhRu9haXKWXXXp2B4wBM= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= cloud.google.com/go/ids v1.2.0 h1:LncHK4HHucb5Du310X8XH9/ICtMwZ2PCfK0ScjWiJoY= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= cloud.google.com/go/iot v1.4.0 h1:Y9+oZT9jD4GUZzORXTU45XsnQrhxmDT+TFbPil6pRVQ= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= cloud.google.com/go/kms v1.6.0 h1:OWRZzrPmOZUzurjI2FBGtgY2mB1WaJkqhw6oIwSj0Yg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/language v1.8.0 h1:3Wa+IUMamL4JH3Zd3cDZUHpwyqplTACt6UZKRD2eCL4= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/lifesciences v0.6.0 h1:tIqhivE2LMVYkX0BLgG7xL64oNpDaFFI7teunglt1tI= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/logging v1.6.1 h1:ZBsZK+JG+oCDT+vaxwqF2egKNRjz8soXiS6Xv79benI= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/managedidentities v1.4.0 h1:3Kdajn6X25yWQFhFCErmKSYTSvkEd3chJROny//F1A0= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/maps v0.1.0 h1:kLReRbclTgJefw2fcCbdLPLhPj0U6UUWN10ldG8sdOU= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.6.0 h1:qAJzpxmEX+SeND10Y/4868L5wfZpo4Y3BIEnIieP4dk= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/memcache v1.7.0 h1:yLxUzJkZVSH2kPaHut7k+7sbIBFpvSh1LW9qjM2JDjA= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/metastore v1.8.0 h1:3KcShzqWdqxrDEXIBWpYJpOOrgpDj+HlBi07Grot49Y= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/monitoring v1.8.0 h1:c9riaGSPQ4dUKWB+M1Fl0N+iLxstMbCktdEwYSPGDvA= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/networkconnectivity v1.7.0 h1:BVdIKaI68bihnXGdCVL89Jsg9kq2kg+II30fjVqo62E= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= cloud.google.com/go/networkmanagement v1.5.0 h1:mDHA3CDW00imTvC5RW6aMGsD1bH+FtKwZm/52BxaiMg= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networksecurity v0.6.0 h1:qDEX/3sipg9dS5JYsAY+YvgTjPR63cozzAWop8oZS94= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/notebooks v1.5.0 h1:AC8RPjNvel3ExgXjO1YOAz+teg9+j+89TNxa7pIZfww= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= cloud.google.com/go/optimization v1.2.0 h1:7PxOq9VTT7TMib/6dMoWpMvWS2E4dJEvtYzjvBreaec= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= cloud.google.com/go/orchestration v1.4.0 h1:39d6tqvNjd/wsSub1Bn4cEmrYcet5Ur6xpaN+SxOxtY= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= cloud.google.com/go/orgpolicy v1.5.0 h1:erF5PHqDZb6FeFrUHiYj2JK2BMhsk8CyAg4V4amJ3rE= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/osconfig v1.10.0 h1:NO0RouqCOM7M2S85Eal6urMSSipWwHU8evzwS+siqUI= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/oslogin v1.7.0 h1:pKGDPfeZHDybtw48WsnVLjoIPMi9Kw62kUE5TXCLCN4= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/phishingprotection v0.6.0 h1:OrwHLSRSZyaiOt3tnY33dsKSedxbMzsXvqB21okItNQ= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= cloud.google.com/go/policytroubleshooter v1.4.0 h1:NQklJuOUoz1BPP+Epjw81COx7IISWslkZubz/1i0UN8= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/privatecatalog v0.6.0 h1:Vz86uiHCtNGm1DeC32HeG2VXmOq5JRYA3VRPf8ZEcSg= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.27.1 h1:q+J/Nfr6Qx4RQeu3rJcnN48SNC0qzlYzSeqkPq93VHs= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= cloud.google.com/go/pubsublite v1.5.0 h1:iqrD8vp3giTb7hI1q4TQQGj77cj8zzgmMPsTZtLnprM= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0 h1:UqzFfb/WvhwXGDF1eQtdHLrmni+iByZXY4h3w9Kdyv8= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recommendationengine v0.6.0 h1:6w+WxPf2LmUEqX0YyvfCoYb8aBYOcbIV25Vg6R0FLGw= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommender v1.8.0 h1:9kMZQGeYfcOD/RtZfcNKGKtoex3DdoB4zRgYU/WaIwE= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/redis v1.10.0 h1:/zTwwBKIAD2DEWTrXZp8WD9yD/gntReF/HkPssVYd0U= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/resourcemanager v1.4.0 h1:NDao6CHMwEZIaNsdWy+tuvHaavNeGP06o1tgrR0kLvU= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= cloud.google.com/go/resourcesettings v1.4.0 h1:eTzOwB13WrfF0kuzG2ZXCfB3TLunSHBur4s+HFU6uSM= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/retail v1.11.0 h1:N9fa//ecFUOEPsW/6mJHfcapPV0wBSwIUwpVZB7MQ3o= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= cloud.google.com/go/run v0.3.0 h1:AWPuzU7Xtaj3Jf+QarDWIs6AJ5hM1VFQ+F6Q+VZ6OT4= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.7.0 h1:K/mxOewgHGeKuATUJNGylT75Mhtjmx1TOkKukATqMT8= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/secretmanager v1.9.0 h1:xE6uXljAC1kCR8iadt9+/blg1fvSbmenlsDN4fT9gqw= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/security v1.10.0 h1:KSKzzJMyUoMRQzcz7azIgqAUqxo7rmQ5rYvimMhikqg= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/securitycenter v1.16.0 h1:QTVtk/Reqnx2bVIZtJKm1+mpfmwRwymmNvlaFez7fQY= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= cloud.google.com/go/servicecontrol v1.5.0 h1:ImIzbOu6y4jL6ob65I++QzvqgFaoAKgHOG+RU9/c4y8= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.7.0 h1:f7M8IMcVzO3T425AqlZbP3yLzeipsBHtRza8vVFYMhQ= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= cloud.google.com/go/servicemanagement v1.5.0 h1:TpkCO5M7dhKSy1bKUD9o/sSEW/U1Gtx7opA1fsiMx0c= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.4.0 h1:b0EwJxPJLpavSljMQh0RcdHsUrr5DQ+Nelt/3BAs5ro= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.4.0 h1:b1LFhFBgKsG252inyhtmsUUZwchqSz3WTvAIf3JFo4g= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= cloud.google.com/go/spanner v1.41.0 h1:NvdTpRwf7DTegbfFdPjAWyD7bOVu0VeMqcvR9aCQCAc= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/speech v1.9.0 h1:yK0ocnFH4Wsf0cMdUyndJQ/hPv02oTJOxzi6AgpBy4s= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= cloud.google.com/go/storagetransfer v1.6.0 h1:fUe3OydbbvHcAYp07xY+2UpH4AermGbmnm7qdEj3tGE= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/talent v1.4.0 h1:MrekAGxLqAeAol4Sc0allOVqUGO8j+Iim8NMvpiD7tM= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= cloud.google.com/go/texttospeech v1.5.0 h1:ccPiHgTewxgyAeCWgQWvZvrLmbfQSFABTMAfrSPLPyY= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= cloud.google.com/go/tpu v1.4.0 h1:ztIdKoma1Xob2qm6QwNh4Xi9/e7N3IfvtwG5AcNsj1g= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/trace v1.4.0 h1:qO9eLn2esajC9sxpqp1YKX37nXC3L4BfGnPS0Cx9dYo= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/translate v1.4.0 h1:AOYOH3MspzJ/bH1YXzB+xTE8fMpn3mwhLjugwGXvMPI= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/video v1.9.0 h1:ttlvO4J5c1VGq6FkHqWPD/aH6PfdxujHt+muTJlW1Zk= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/videointelligence v1.9.0 h1:RPFgVVXbI2b5vnrciZjtsUgpNKVtHO/WIyXUhEfuMhA= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= cloud.google.com/go/vision/v2 v2.5.0 h1:TQHxRqvLMi19azwm3qYuDbEzZWmiKJNTpGbkNsfRCik= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= cloud.google.com/go/vmmigration v1.3.0 h1:A2Tl2ZmwMRpvEmhV2ibISY85fmQR+Y5w9a0PlRz5P3s= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= cloud.google.com/go/vmwareengine v0.1.0 h1:JMPZaOT/gIUxVlTqSl/QQ32Y2k+r0stNeM1NSqhVP9o= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= cloud.google.com/go/vpcaccess v1.5.0 h1:woHXXtnW8b9gLFdWO9HLPalAddBQ9V4LT+1vjKwR3W8= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/webrisk v1.7.0 h1:ypSnpGlJnZSXbN9a13PDmAYvVekBLnGKxQ3Q9SMwnYY= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= cloud.google.com/go/websecurityscanner v1.4.0 h1:y7yIFg/h/mO+5Y5aCOtVAnpGUOgqCH5rXQ2Oc8Oq2+g= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/workflows v1.9.0 h1:7Chpin9p50NTU8Tb7qk+I11U/IwVXmDhEoSsdccvInE= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= @@ -336,7 +460,9 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXe github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= @@ -353,7 +479,9 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 h1:hzAQntlaYRkVSFEfj9OTWlVV1H155FMD8BTKktLv0QI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490 h1:KwaoQzs/WeUxxJqiJsZ4euOly1Az/IgZXXSxlD/UBNk= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/cockroach-go/v2 v2.1.1 h1:3XzfSMuUT0wBe1a3o5C0eOTcArhmmFAg2Jzh/7hhKqo= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= @@ -413,7 +541,9 @@ github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.6.2 h1:JiO+kJTpmYGjEodY7O1Zk8oZcNz1+f30UtwtXoFUPzE= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a h1:QNEenQIsGDEEfFNSnN+h6hE1OwnHqTg7Dl9gEk1Cko4= github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -422,6 +552,7 @@ github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8S github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7gIh9+5fvk= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= github.com/gabriel-vasile/mimetype v1.4.0 h1:Cn9dkdYsMIu56tGho+fqzh7XmvY2YyGU0FnbhiOsEro= @@ -486,6 +617,7 @@ github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPh github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -498,13 +630,16 @@ github.com/google/go-containerregistry v0.5.1 h1:/+mFTs4AlwsJ/mJe8NDtKb7BxLtbZFp github.com/google/go-github/v39 v39.2.0 h1:rNNM311XtPOz5rDdsJXAp2o8F67X9FnROXTvto3aSnQ= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= @@ -512,6 +647,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= @@ -528,6 +665,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hashicorp/consul/api v1.18.0 h1:R7PPNzTCeN6VuQNDwwhZWJvzCtGSrNpJqfb22h3yH9g= github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -711,6 +849,7 @@ github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFo github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1 h1:ZFfeKAhIQiiOrQaI3/znw0gOmYpO28Tcu1YaqMa/jtQ= github.com/sagikazarmark/crypt v0.9.0 h1:fipzMFW34hFUEc4D7fsLQFtE7yElkpgyS2zruedRdZk= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9M= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/sclevine/agouti v3.0.0+incompatible h1:8IBJS6PWz3uTlMP3YBIR5f+KAldcGuOeFkFbUWfBgK4= @@ -774,12 +913,16 @@ go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= go.etcd.io/etcd/api/v3 v3.5.6 h1:Cy2qx3npLcYqTKqGJzMypnMv2tiRyifZJ17BlWIWA7A= go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= go.etcd.io/etcd/client/pkg/v3 v3.5.6 h1:TXQWYceBKqLp4sa87rcPs11SXxUA/mHwH975v+BDvLU= go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= go.etcd.io/etcd/client/v2 v2.305.6 h1:fIDR0p4KMjw01MJMfUIDWdQbjo06PD6CeYM5z4EHLi0= go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= go.etcd.io/etcd/client/v3 v3.5.6 h1:coLs69PWCXE9G4FKquzNaSHrRyMCAXwF+IX1tAPVO8E= go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.etcd.io/etcd/pkg/v3 v3.5.0 h1:ntrg6vvKRW26JRmHTE0iNlDgYK6JX3hg/4cD62X0ixk= go.etcd.io/etcd/raft/v3 v3.5.0 h1:kw2TmO3yFTgE+F0mdKkG7xMxkit2duBDa2Hu6D/HMlw= go.etcd.io/etcd/server/v3 v3.5.0 h1:jk8D/lwGEDlQU9kZXUFMSANkE22Sg5+mW27ip8xcF9E= @@ -810,12 +953,15 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEa go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/image v0.0.0-20210216034530-4410531fe030 h1:lP9pYkih3DUSC641giIXa2XqfTIbbbRr0w2EOTA7wHA= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= @@ -828,6 +974,7 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= @@ -842,7 +989,10 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -874,6 +1024,7 @@ golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= @@ -894,8 +1045,13 @@ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -923,6 +1079,13 @@ google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZV google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= @@ -932,15 +1095,18 @@ google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= diff --git a/dbm-services/riak/db-tools/dbactuator/go.mod b/dbm-services/riak/db-tools/dbactuator/go.mod index 52557c5a11..d0057aa1b1 100644 --- a/dbm-services/riak/db-tools/dbactuator/go.mod +++ b/dbm-services/riak/db-tools/dbactuator/go.mod @@ -13,6 +13,7 @@ require ( github.com/spf13/cobra v1.7.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 gopkg.in/ini.v1 v1.67.0 + gopkg.in/yaml.v2 v2.4.0 ) require ( diff --git a/dbm-services/riak/db-tools/dbactuator/go.sum b/dbm-services/riak/db-tools/dbactuator/go.sum index 5da0d8b751..b072bde61d 100644 --- a/dbm-services/riak/db-tools/dbactuator/go.sum +++ b/dbm-services/riak/db-tools/dbactuator/go.sum @@ -42,5 +42,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/cmd.go b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/cmd.go index 38fb0b890f..7bcfebed51 100644 --- a/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/cmd.go +++ b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/cmd.go @@ -33,6 +33,9 @@ func NewRiakCommand() *cobra.Command { NewUninstallCommand(), NewStopCommand(), NewStartCommand(), + NewDeployMonitorCommand(), + NewStartMonitorCommand(), + NewStopMonitorCommand(), }, }, } diff --git a/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/deploy_monitor.go b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/deploy_monitor.go new file mode 100644 index 0000000000..123e139801 --- /dev/null +++ b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/deploy_monitor.go @@ -0,0 +1,91 @@ +package riakcmd + +import ( + "fmt" + + "dbm-services/common/go-pubpkg/logger" + "dbm-services/riak/db-tools/dbactuator/internal/subcmd" + "dbm-services/riak/db-tools/dbactuator/pkg/components/riak" + "dbm-services/riak/db-tools/dbactuator/pkg/util" + + "github.com/spf13/cobra" +) + +// DeployMonitorAct 部署riak监控dbactor参数 +type DeployMonitorAct struct { + *subcmd.BaseOptions + Payload riak.DeployMonitorComp +} + +// NewDeployMonitorCommand riak搬迁数据进度 +func NewDeployMonitorCommand() *cobra.Command { + act := DeployMonitorAct{ + BaseOptions: subcmd.GBaseOptions, + } + cmd := &cobra.Command{ + Use: "deploy-monitor", + Short: "部署监控", + Example: fmt.Sprintf("dbactuator riak deploy-monitor %s", subcmd.CmdBaseExampleStr), + Run: func(cmd *cobra.Command, args []string) { + util.CheckErr(act.Validator()) + util.CheckErr(act.Init()) + util.CheckErr(act.Run()) + }, + } + return cmd +} + +// Validator TODO +func (d *DeployMonitorAct) Validator() error { + return d.BaseOptions.Validate() +} + +// Init 反序列化并检查 +func (d *DeployMonitorAct) Init() error { + if err := d.DeserializeAndValidate(&d.Payload); err != nil { + logger.Error("DeserializeAndValidate err %s", err.Error()) + return err + } + return nil +} + +// Run 运行 +func (d *DeployMonitorAct) Run() error { + steps := subcmd.Steps{ + { + FunName: "解压crond和monitor介质", + Func: d.Payload.DeployBinary, + }, + // riak使用mysql-crond实现定时功能 + // 生成mysql-crond与riak-monitor的配置文件,部分根据template生成 + // 部分直接生成yaml + { + FunName: "生成crond的runtime.yaml文件", + Func: d.Payload.GenerateCrondConfigYaml, + }, + { + FunName: "生成monitor的runtime.yaml文件", + Func: d.Payload.GenerateMonitorConfigYaml, + }, + { + FunName: "生成crond的jobs-config.yaml文件", + Func: d.Payload.GenerateJobsConfigYaml, + }, + { + FunName: "生成monitor的items-config.yaml文件", + Func: d.Payload.GenerateItemsConfigYaml, + }, + // 前台预执行便于发现执行报错,然后后台正式执行 + { + FunName: "部署监控", + Func: d.Payload.DeployMonitor, + }, + } + // 部署失败 + if err := steps.Run(); err != nil { + return err + } + // 部署成功 + logger.Info("deploy monitor success") + return nil +} diff --git a/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/start_monitor.go b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/start_monitor.go new file mode 100644 index 0000000000..f6b17b97ec --- /dev/null +++ b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/start_monitor.go @@ -0,0 +1,65 @@ +package riakcmd + +import ( + "fmt" + + "dbm-services/common/go-pubpkg/logger" + "dbm-services/riak/db-tools/dbactuator/internal/subcmd" + "dbm-services/riak/db-tools/dbactuator/pkg/components/riak" + "dbm-services/riak/db-tools/dbactuator/pkg/util" + + "github.com/spf13/cobra" +) + +// StartMonitorAct 启动监控riak dbactor参数 +type StartMonitorAct struct { + *subcmd.BaseOptions + Payload riak.StartMonitorComp +} + +// NewStartMonitorCommand riak搬迁数据进度 +func NewStartMonitorCommand() *cobra.Command { + act := StartMonitorAct{ + BaseOptions: subcmd.GBaseOptions, + } + cmd := &cobra.Command{ + Use: "start-monitor", + Short: "启动监控", + Example: fmt.Sprintf("dbactuator riak start-monitor %s", subcmd.CmdBaseExampleStr), + Run: func(cmd *cobra.Command, args []string) { + util.CheckErr(act.Validator()) + util.CheckErr(act.Init()) + util.CheckErr(act.Run()) + }, + } + return cmd +} + +// Validator TODO +func (d *StartMonitorAct) Validator() error { + return d.BaseOptions.Validate() +} + +// Init 反序列化并检查 +func (d *StartMonitorAct) Init() error { + if err := d.DeserializeAndValidate(&d.Payload); err != nil { + logger.Error("DeserializeAndValidate err %s", err.Error()) + return err + } + return nil +} + +// Run 运行 +func (d *StartMonitorAct) Run() error { + steps := subcmd.Steps{ + { + FunName: "启动监控", + Func: d.Payload.StartMonitor, + }, + } + if err := steps.Run(); err != nil { + return err + } + logger.Info("start monitor success") + return nil +} diff --git a/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/stop_monitor.go b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/stop_monitor.go new file mode 100644 index 0000000000..c8e7bc63ae --- /dev/null +++ b/dbm-services/riak/db-tools/dbactuator/internal/subcmd/riakcmd/stop_monitor.go @@ -0,0 +1,65 @@ +package riakcmd + +import ( + "fmt" + + "dbm-services/common/go-pubpkg/logger" + "dbm-services/riak/db-tools/dbactuator/internal/subcmd" + "dbm-services/riak/db-tools/dbactuator/pkg/components/riak" + "dbm-services/riak/db-tools/dbactuator/pkg/util" + + "github.com/spf13/cobra" +) + +// StopMonitorAct 关闭监控riak dbactor参数 +type StopMonitorAct struct { + *subcmd.BaseOptions + Payload riak.StopMonitorComp +} + +// NewStopMonitorCommand riak关闭监控 +func NewStopMonitorCommand() *cobra.Command { + act := StopMonitorAct{ + BaseOptions: subcmd.GBaseOptions, + } + cmd := &cobra.Command{ + Use: "stop-monitor", + Short: "关闭监控", + Example: fmt.Sprintf("dbactuator riak stop-monitor %s", subcmd.CmdBaseExampleStr), + Run: func(cmd *cobra.Command, args []string) { + util.CheckErr(act.Validator()) + util.CheckErr(act.Init()) + util.CheckErr(act.Run()) + }, + } + return cmd +} + +// Validator TODO +func (d *StopMonitorAct) Validator() error { + return d.BaseOptions.Validate() +} + +// Init 反序列化并检查 +func (d *StopMonitorAct) Init() error { + if err := d.DeserializeAndValidate(&d.Payload); err != nil { + logger.Error("DeserializeAndValidate err %s", err.Error()) + return err + } + return nil +} + +// Run 运行 +func (d *StopMonitorAct) Run() error { + steps := subcmd.Steps{ + { + FunName: "关闭监控", + Func: d.Payload.StopMonitor, + }, + } + if err := steps.Run(); err != nil { + return err + } + logger.Info("stop monitor success") + return nil +} diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/deploy_monitor.go b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/deploy_monitor.go new file mode 100644 index 0000000000..dc5184f09e --- /dev/null +++ b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/deploy_monitor.go @@ -0,0 +1,342 @@ +// Package riak TODO +/* + * @Description: 安装 Riak + */ +package riak + +import ( + "bytes" + "dbm-services/common/go-pubpkg/logger" + "dbm-services/riak/db-tools/dbactuator/pkg/components" + "dbm-services/riak/db-tools/dbactuator/pkg/core/cst" + "dbm-services/riak/db-tools/dbactuator/pkg/util/osutil" + "fmt" + "io/ioutil" + "net/http" + "os" + "os/exec" + "path" + "text/template" + "time" + + "github.com/pkg/errors" + "gopkg.in/yaml.v2" +) + +// DeployMonitorComp TODO +type DeployMonitorComp struct { + Params *DeployMonitorParam `json:"extend"` + DeployMonitorRunTimeCtx `json:"-"` +} + +// DeployMonitorParam TODO +type DeployMonitorParam struct { + CrondPkg components.Medium `json:"crond_pkg" validate:"required"` + MonitorPkg components.Medium `json:"monitor_pkg" validate:"required"` + CrondConfig CrondConfigYaml `json:"crond_config" validate:"required"` + MonitorConfig MonitorConfigYaml `json:"monitor_config" validate:"required"` + MonitorItems []MonitorItem `json:"monitor_items" validate:"required"` + JobsConfig JobsConfig `json:"jobs_config" validate:"required"` +} + +type JobsConfig struct { + Jobs []Job `json:"jobs" yaml:"jobs"` + BkBizId int `json:"bk_biz_id" yaml:"bk_biz_id" validate:"required"` +} + +type Job struct { + Name string `json:"name" yaml:"name"` + Enable bool `json:"enable" yaml:"enable"` + Command string `json:"command" yaml:"command"` + Args []string `json:"args" yaml:"args"` + Schedule string `json:"schedule" yaml:"schedule"` + Creator string `json:"creator" yaml:"creator"` + WorkDir string `json:"work_dir" yaml:"work_dir"` +} + +// DeployMonitorRunTimeCtx 运行时上下文 +type DeployMonitorRunTimeCtx struct { + LocalIp string +} + +type CrondConfigYaml struct { + IP string `json:"ip" validate:"required,ipv4"` + BkCloudId *int `json:"bk_cloud_id" validate:"required,gte=0"` + EventDataId int `json:"event_data_id" validate:"required"` + EventDataToken string `json:"event_data_token" validate:"required"` + MetricsDataId int `json:"metrics_data_id" validate:"required"` + MetricsDataToken string `json:"metrics_data_token" validate:"required"` + LogPath string `json:"log_file_dir"` + PidPath string `json:"pid_path"` + InstallPath string `json:"install_path"` + BeatPath string `json:"beat_path" validate:"required"` + AgentAddress string `json:"agent_address" validate:"required"` +} + +type MonitorConfigYaml struct { + BkBizId int `json:"bk_biz_id" validate:"required"` + IP string `json:"ip" validate:"required,ipv4"` + Port int `json:"port" validate:"required,gt=1024,lte=65535"` + BkInstanceId int `json:"bk_instance_id" validate:"required,gt=0"` + ImmuteDomain string `json:"immute_domain" validate:"required"` + MachineType string `json:"machine_type" validate:"required"` + BkCloudId *int `json:"bk_cloud_id" validate:"required,gte=0"` + LogPath string `json:"log_path"` + ItemsConfigPath string `json:"items_config_file" validate:"required"` + InteractTimeout time.Duration `json:"interact_timeout" validate:"required"` +} + +type MonitorItem struct { + Name string `json:"name" yaml:"name"` + Enable *bool `json:"enable" yaml:"enable"` + Schedule *string `json:"schedule" yaml:"schedule"` + MachineType []string `json:"machine_type" yaml:"machine_type"` +} + +// DeployMonitor 启动监控 +func (i *DeployMonitorComp) DeployMonitor() error { + // riak-monitor启动指令存储到jobs-config.yaml,jobs-config.yaml作为mysql-crond的runtime.yaml中的jobs_config + // 启动mysql-crond时,会完成riak-monitor监控项注册。mysql-crond定时执行riak-monitor的指令,实现监控。 + + // 前台执行mysql-crond,方便获取报错 + errChan := make(chan error) + var dryRunErr error + go func() { + dryRunCmd := fmt.Sprintf("%s -c %s", path.Join(cst.CrondPath, "mysql-crond"), + path.Join(cst.CrondPath, "runtime.yaml")) + cmd := exec.Command("bash", "-c", dryRunCmd) + var stderr bytes.Buffer + cmd.Stderr = &stderr + err := cmd.Run() + if err != nil { + errChan <- errors.Wrap(err, stderr.String()) + return + } + errChan <- nil + return + }() + select { + case dryRunErr = <-errChan: + if dryRunErr != nil { + dryRunErr = fmt.Errorf("crond dry-run error: %s", dryRunErr.Error()) + logger.Error(dryRunErr.Error()) + return dryRunErr + } + case <-time.After(time.Second * 10): + // crond运行正常不会自动退出,10秒后没有报错,进一步检查是否启动正常 + logger.Info("crond dry-run running 10s without error") + } + + // 检查crond是否启动 + err := GetCrondEntries() + if err != nil { + logger.Error("crond dry-run check error: %s", err.Error()) + return err + } + + // 退出前台mysql-crond + err = QuitCrond() + if err != nil { + logger.Error("quit crond dry-run error: %s", err.Error()) + return err + } + // 后台执行mysql-crond + nohup := fmt.Sprintf("%s -c %s", path.Join(cst.CrondPath, "start.sh"), + path.Join(cst.CrondPath, "runtime.yaml")) + logger.Info("start crond cmd: %s", nohup) + cmd := exec.Command("bash", "-c", nohup) + err = cmd.Run() + if err != nil { + logger.Error("execute crond failed: %s", err.Error()) + return err + } + time.Sleep(10 * time.Second) + // 检查crond是否启动 + err = GetCrondEntries() + if err != nil { + logger.Error("crond check error: %s", err.Error()) + return err + } + logger.Info("crond started") + return nil +} + +// DeployBinary 部署二进制 +func (i *DeployMonitorComp) DeployBinary() (err error) { + // 解压crond介质 + err = Decompress(i.Params.CrondPkg.GetAbsolutePath(), cst.CrondPath) + if err != nil { + logger.Error("decompress: %s to %s failed: %s", i.Params.CrondPkg.GetAbsolutePath(), + cst.CrondPath, err.Error()) + return err + } + // 解压监控的介质 + err = Decompress(i.Params.MonitorPkg.GetAbsolutePath(), cst.RiakMonitorPath) + if err != nil { + logger.Error("decompress: %s to %s failed: %s", i.Params.MonitorPkg.GetAbsolutePath(), + cst.RiakMonitorPath, err.Error()) + return err + } + return nil +} + +// GenerateCrondConfigYaml 生成crond的runtime.yaml文件 +func (i *DeployMonitorComp) GenerateCrondConfigYaml() (err error) { + i.Params.CrondConfig.LogPath = path.Join(cst.CrondPath, i.Params.CrondConfig.LogPath) + i.Params.CrondConfig.PidPath = cst.CrondPath + i.Params.CrondConfig.InstallPath = cst.CrondPath + err = UseTemplate(cst.CrondPath, "mysql-crond.conf.go.tpl", "runtime.yaml", i.Params.CrondConfig) + if err != nil { + logger.Error("generate crond runtime.yaml error: %s", err.Error()) + return err + } + // todo mysql-crond 模版中jobs_user不是固定值 + cmd := fmt.Sprintf(`sed -i "s/jobs_user: mysql/jobs_user: root/g" %s`, path.Join(cst.CrondPath, "runtime.yaml")) + _, err = osutil.ExecShellCommand(false, cmd) + if err != nil { + logger.Error("execute %s error: %s", cmd, err.Error()) + return err + } + return nil +} + +// GenerateMonitorConfigYaml 生成runtime.yaml文件 +func (i *DeployMonitorComp) GenerateMonitorConfigYaml() (err error) { + i.Params.MonitorConfig.LogPath = path.Join(cst.RiakMonitorPath, i.Params.MonitorConfig.LogPath) + i.Params.MonitorConfig.ItemsConfigPath = path.Join(cst.RiakMonitorPath, i.Params.MonitorConfig.ItemsConfigPath) + err = UseTemplate(cst.RiakMonitorPath, "config.yaml.go.tpl", "runtime.yaml", i.Params.MonitorConfig) + if err != nil { + logger.Error("generate monitor runtime.yaml error: %s", err.Error()) + return err + } + return nil +} + +// GenerateJobsConfigYaml 生成jobs-config.yaml文件 +func (i *DeployMonitorComp) GenerateJobsConfigYaml() (err error) { + err = CreateYaml(cst.CrondPath, "jobs-config.yaml", i.Params.JobsConfig) + if err != nil { + logger.Error("create items-config.yaml file failed: %s", err.Error()) + return err + } + return nil +} + +// GenerateItemsConfigYaml 生成items-config.yaml文件 +func (i *DeployMonitorComp) GenerateItemsConfigYaml() (err error) { + err = CreateYaml(cst.RiakMonitorPath, "items-config.yaml", i.Params.MonitorItems) + if err != nil { + logger.Error("create items-config.yaml file failed: %s", err.Error()) + return err + } + return nil +} + +// Decompress 解压文件到目标路径 +func Decompress(source, target string) error { + err := os.MkdirAll(target, 0755) + if err != nil { + logger.Error("mkdir %s failed: %s", target, err.Error()) + return err + } + decompressCmd := fmt.Sprintf( + `tar zxf %s -C %s`, + source, target, + ) + _, err = osutil.ExecShellCommand(false, decompressCmd) + if err != nil { + logger.Error("decompress mysql-crond pkg failed: %s", err.Error()) + return err + } + return nil +} + +// UseTemplate 使用模版生成yaml文件 +func UseTemplate(vpath, tpl, target string, data interface{}) error { + t, err := template.ParseFiles(path.Join(vpath, tpl)) + if err != nil { + logger.Error("read config template failed: %s", err.Error()) + return err + } + + f, err := os.OpenFile( + path.Join(vpath, target), + os.O_CREATE|os.O_TRUNC|os.O_WRONLY, + 0644, + ) + if err != nil { + logger.Error("create yaml failed: %s", err.Error()) + return err + } + + err = t.Execute(f, data) + if err != nil { + logger.Error("execute template failed: %s", err.Error()) + return err + } + return nil +} + +// CreateYaml 根据结构体生成yaml文件 +func CreateYaml(vpath, target string, data interface{}) error { + content, err := yaml.Marshal(data) + if err != nil { + logger.Error("marshal data failed: %s", err.Error()) + return err + } + f, err := os.OpenFile(path.Join(vpath, target), + os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0755) + if err != nil { + logger.Error("create file failed: %s", err.Error()) + return err + } + _, err = f.Write(append(content, []byte("\n")...)) + if err != nil { + logger.Error("write file failed: %s", err.Error()) + return err + } + return nil +} + +func GetCrondEntries() error { + url := fmt.Sprintf("http://127.0.0.1:%d/entries", cst.CrondListenPort) + resp, err := http.Get(url) + defer resp.Body.Close() + if err != nil { + err = fmt.Errorf("connect crond failed: %s", err.Error()) + logger.Error(err.Error()) + return err + } + if resp.StatusCode != 200 { + err = fmt.Errorf("connect crond response status code is: %d not 200 ", resp.StatusCode) + logger.Error(err.Error()) + return err + } + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + err = fmt.Errorf("get crond response failed: %s", err.Error()) + logger.Info(err.Error()) + return err + } + logger.Info("monitor entries register in crond:\n%s", string(body)) + return nil +} + +func QuitCrond() error { + // 关闭启动的 mysql-crond + url := fmt.Sprintf("http://127.0.0.1:%d/quit", cst.CrondListenPort) + resp, err := http.Get(url) + defer resp.Body.Close() + if err != nil { + logger.Error("call quit failed: %s", err.Error()) + return err + } + if resp.StatusCode != 200 { + err = fmt.Errorf("quit crond response status code is: %d not 200 ", resp.StatusCode) + logger.Error(err.Error()) + return err + } + time.Sleep(15 * time.Second) + logger.Info("quit crond success") + return nil +} diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start.go b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start.go index ed5f8febd5..c1b518f027 100644 --- a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start.go +++ b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start.go @@ -18,7 +18,7 @@ type StartParam struct { type StartRunTimeCtx struct { } -// Start 下架 +// Start 启动 func (i *StartComp) Start() error { return Start() } diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start_monitor.go b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start_monitor.go new file mode 100644 index 0000000000..c3edb64c93 --- /dev/null +++ b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/start_monitor.go @@ -0,0 +1,25 @@ +// Package riak TODO +/* + * @Description: 安装 Riak + */ +package riak + +// StartMonitorComp TODO +type StartMonitorComp struct { + Params *StartMonitorParam `json:"extend"` + StartMonitorRunTimeCtx `json:"-"` +} + +// StartMonitorParam TODO +type StartMonitorParam struct { +} + +// StartMonitorRunTimeCtx 运行时上下文 +type StartMonitorRunTimeCtx struct { +} + +// StartMonitor 启动监控 +func (i *StartMonitorComp) StartMonitor() error { + var deploy *DeployMonitorComp + return deploy.DeployMonitor() +} diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop.go b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop.go index 95b479b77e..5b3d25f873 100644 --- a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop.go +++ b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop.go @@ -25,7 +25,7 @@ type StopParam struct { type StopRunTimeCtx struct { } -// Stop 下架 +// Stop 关闭 func (i *StopComp) Stop() error { // 关闭实例 cmd := "riak stop" diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop_monitor.go b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop_monitor.go new file mode 100644 index 0000000000..f8414640db --- /dev/null +++ b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/stop_monitor.go @@ -0,0 +1,33 @@ +// Package riak TODO +/* + * @Description: 安装 Riak + */ +package riak + +import "dbm-services/common/go-pubpkg/logger" + +// StopMonitorComp TODO +type StopMonitorComp struct { + Params *StopMonitorParam `json:"extend"` + StopMonitorRunTimeCtx `json:"-"` +} + +// StopMonitorParam TODO +type StopMonitorParam struct { +} + +// StopMonitorRunTimeCtx 运行时上下文 +type StopMonitorRunTimeCtx struct { +} + +// StopMonitor 关闭监控 +func (i *StopMonitorComp) StopMonitor() error { + // 退出mysql-crond + err := QuitCrond() + if err != nil { + logger.Error("quit crond error: %s", err.Error()) + return err + } + logger.Info("quit crond success") + return nil +} diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/uninstall.go b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/uninstall.go index 33f5d0a1fa..2e44ddc8cb 100644 --- a/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/uninstall.go +++ b/dbm-services/riak/db-tools/dbactuator/pkg/components/riak/uninstall.go @@ -79,13 +79,11 @@ func (i *UninstallComp) Uninstall() error { // 关闭守护进程 killDaemon := `ps -ef | grep 'epmd -daemon' | grep riak | grep -v grep | awk '{print "kill -9 "$2";"}' | sh` vtime := time.Now().Local().Format(cst.TimeLayoutDir) - // 清理crontab - cronBak := fmt.Sprintf("crontab -u riak -l > /data/crontab.bak.%s 2>&1", vtime) - cronDel := "crontab -u riak -r" // 清理riak数据以及日志文件 - fileBak := fmt.Sprintf("mv %s/riak /data/riak.bak.%s", cst.DefaultDataRootPath, vtime) - fileBak2 := fmt.Sprintf("mv %s/riak /data1/riak.bak.%s", cst.AlterNativeDataRootPath, vtime) - cmds := []string{killDaemon, cronBak, cronDel, fileBak, fileBak2} + fileBak := fmt.Sprintf("mv %s/riak %s/riak.bak.%s", cst.DefaultDataRootPath, cst.DefaultDataRootPath, vtime) + fileBak2 := fmt.Sprintf("mv %s/riak %s/riak.bak.%s", cst.AlterNativeDataRootPath, cst.AlterNativeDataRootPath, vtime) + fileBak3 := fmt.Sprintf("mv %s %s.bak.%s", cst.MonitorPath, cst.MonitorPath, vtime) + cmds := []string{killDaemon, fileBak, fileBak2, fileBak3} for _, cmd := range cmds { res, err := osutil.ExecShellCommand(false, cmd) diff --git a/dbm-services/riak/db-tools/dbactuator/pkg/core/cst/riak.go b/dbm-services/riak/db-tools/dbactuator/pkg/core/cst/riak.go index 95eeb2b141..d651272880 100644 --- a/dbm-services/riak/db-tools/dbactuator/pkg/core/cst/riak.go +++ b/dbm-services/riak/db-tools/dbactuator/pkg/core/cst/riak.go @@ -11,7 +11,11 @@ const ( // DefaultHttpPort riak http监听接口 DefaultHttpPort = 8098 // LogPath 日志路径 - LogPath = "/data/riak/log" + LogPath = "/data/riak/log" + MonitorPath = "/data/monitor" + RiakMonitorPath = "/data/monitor/riak-monitor" + CrondPath = "/data/monitor/riak-crond" + CrondListenPort = 9999 // DataDir data目录 DataDir = "/riak/data" // ConfigPath 配置文件路径 diff --git a/dbm-services/riak/db-tools/riak-monitor/.gitignore b/dbm-services/riak/db-tools/riak-monitor/.gitignore new file mode 100644 index 0000000000..12520a1502 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/.gitignore @@ -0,0 +1,32 @@ +build +.idea +logs +.DS_Store +cmd/generator +!.gitkeep +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +# Test binary, built with `go test -c` +*.test +# Output of the go coverage tool, specifically when used with LiteIDE +*.out +# Dependency directories (remove the comment below to include it) +vendor/ +# Go workspace file +go.work +configs/* +log/ +build/ +conf/ +*exe +*.log +.idea/ +sync_test.sh +.vscode/ +scripts/upload_media.sh +scripts/upload.sh +.ci \ No newline at end of file diff --git a/dbm-services/riak/db-tools/riak-monitor/Makefile b/dbm-services/riak/db-tools/riak-monitor/Makefile new file mode 100644 index 0000000000..19af8d1544 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/Makefile @@ -0,0 +1,26 @@ +PROJ="riak-monitor" +MODULE="dbm-services/riak/db-tools/riak-monitor" +VERSION = $(error please set VERSION flag) +PKG = ${PROJ}.tar.gz +OUTPUT_DIR = build +RELEASE_BUILD_FLAG = "-X ${MODULE}/cmd.version=${VERSION} -X ${MODULE}/cmd.buildStamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'` -X ${MODULE}/cmd.gitHash=`git rev-parse HEAD` " +DEV_BUILD_FLAG = "-X ${MODULE}/cmd.version="develop" -X ${MODULE}/cmd.buildStamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'` -X ${MODULE}/cmd.gitHash="" " + + +.PHONY: release-bin +release-bin: + @CGO_ENABLE=0 GOARCH=amd64 GOOS=linux go build -ldflags ${RELEASE_BUILD_FLAG} -o ${OUTPUT_DIR}/${$PROJ} + @cp config.yaml.go.tpl ${OUTPUT_DIR}/config.yaml.go.tpl + @tar -C ${OUTPUT_DIR} -zcf ${OUTPUT_DIR}/${PKG} riak-monitor config.yaml.go.tpl + +.PHONY: dev-bin +dev-bin: + @go build -ldflags ${DEV_BUILD_FLAG} -o ${OUTPUT_DIR}/${PROJ} + @cp config.yaml.go.tpl ${OUTPUT_DIR}/config.yaml.go.tpl + @tar -C ${OUTPUT_DIR} -zcf ${OUTPUT_DIR}/${PKG} riak-monitor config.yaml.go.tpl + +.PHONY: clean +clean: + @rm -rf $(OUTPUT_DIR) + + diff --git a/dbm-services/riak/db-tools/riak-monitor/README.md b/dbm-services/riak/db-tools/riak-monitor/README.md new file mode 100644 index 0000000000..8ab7225a78 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/README.md @@ -0,0 +1,194 @@ +# 使用 +* riak-monitor被mysql-crond调起 +* 必须先部署 `mysql-crond` +* 配置文件分为 _runtime_ 配置 和 监控项配置 +* _runtime_ 配置需要作为命令行参数传入, 如 `mysql-crond -c runtime.yaml` +* 监控项配置在 _runtime_ 配置中指定,相关配置文件示例见”示例文件“ +* 前台启动 + * 示例: + * /data/monitor/riak-crond/mysql-crond -c /data/monitor/riak-crond/runtime.yaml +* 后台执行 + * 示例: + * /data/monitor/riak-crond/start.sh -c /data/monitor/riak-crond/runtime.yaml + * cat start.sh + * SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + cd $SCRIPT_DIR && nohup ./mysql-crond ${@:1} & + +* 查看定时任务: + * curl http://xxx:xxx/entries +* 关闭定时任务: + * curl http://xxx:xxx/quit + +## 硬编码项 +目前有两个硬编码项 +1. 执行心跳 +2. 连接 _DB_ 失败 +* 如果监控项配置中缺少这两项, 会被自动添加 +* 以 `hardcode-run` 子命令运行 + + +# 监控项配置 +```go +type MonitorItem struct { + Name string `yaml:"name" validate:"required"` + Enable *bool `yaml:"enable" validate:"required"` + Schedule *string `yaml:"schedule"` + MachineType string `yaml:"machine_type"` +} +``` + +* `name`: 监控项名称, 对应蓝鲸监控平台的事件 +* `enable`: 是否启用 +* `schedule`: 可选, 在 _runtime_ 配置中有默认值, 不建议修改 +* `machine_type`: 基于机器类型的过滤 + +## 分组 +在注册 `mysql-crond entry` 时, 会按照 _schedule_ 把所有监控项分组注册 + +# 开发 +1. 在 `items_collect` 中添加监控项目录, 如 _some_new_item_ +2. 在 _some_new_item_ 中实现 `monitor_item_interface.MonitorItemInterface` +3. 同时还要提供 + * `func New(cc *monitor_item_interface.ConnectionCollect) monitor_item_interface.MonitorItemInterface` + * `func Register() (string, monitor_item_interface.MonitorItemConstructorFuncType)` +4. 在 `items_collect.init` 中注册新增的监控项 +5. 把新增监控项的相关配置已经添加到 _items-config.yaml_ 中 + + +# 监控项 + +| 监控项 |调度计划| 机器类型 | 实例角色 |级别| 说明 |自定义| +|--------------------------|-----|----------------|-----------------|-----|-----------------------------|-----| +| riak-err-notice |@every 1m| riak | | 预警 | 预警错误日志 |schedule, enable +| db-up |@every 10s| backend, proxy | | 致命 | db 连通性. 硬编码, 不可配置, 无需录入配置系统 |enable +| riak_monitor_heart_beat |@every 10s| riak | | 致命 | 监控心跳. 硬编码, 不可配置, 无需录入配置系统 |enable +| riak-load-health |@every 1m| riak | | 致命 | 检查负载与响应情况 |enable +| riak-ring-status |@every 10s| riak | | 致命 | 检查ring status, 发现集群中所有的故障节点 |enable + + +## 示例文件: +请在Editor模式下查看 +1. mysql-crond的runtime.yaml示例: +ip: xxx +port: xxx +bk_cloud_id: 0 +bk_monitor_beat: +custom_event: +bk_data_id: xxx +access_token: xxx +report_type: agent +message_kind: event +custom_metrics: +bk_data_id: xxx +access_token: xxx +report_type: agent +message_kind: timeseries +beat_path: xxx +agent_address: xxx +log: +console: false +log_file_dir: /data/monitor/riak-crond +debug: false +source: true +json: true +pid_path: /data/monitor/riak-crond +jobs_user: root +jobs_config: /data/monitor/riak-crond/jobs-config.yaml + + +2. mysql-crond的jobs-config.yaml示例: +- name: riak-err-notice@every 1m + enable: true + command: /data/monitor/riak-monitor/riak-monitor + args: + - run + - --items + - riak-err-notice + - -c + - /data/monitor/riak-monitor/runtime.yaml + schedule: '@every 1m' + creator: admin + work_dir: "" +- name: riak-load-health@every 1m + enable: true + command: /data/monitor/riak-monitor/riak-monitor + args: + - run + - --items + - riak-load-health + - -c + - /data/monitor/riak-monitor/runtime.yaml + schedule: '@every 1m' + creator: admin + work_dir: "" +- name: riak-ring-status@every 10s + enable: true + command: /data/monitor/riak-monitor/riak-monitor + args: + - run + - --items + - riak-ring-status + - -c + - /data/monitor/riak-monitor/runtime.yaml + schedule: '@every 10s' + creator: admin + work_dir: "" +- name: riak-monitor-hardcode@every 10s + enable: true + command: /data/monitor/riak-monitor/riak-monitor + args: + - hardcode-run + - --items + - db-up,riak_monitor_heart_beat + - -c + - /data/monitor/riak-monitor/runtime.yaml + schedule: '@every 10s' + creator: admin + work_dir: "" + bk_biz_id: xxx + +3. riak-monitor的runtime.yaml示例: +bk_biz_id: xxx +ip: xxx +port: xxx +bk_instance_id: xxx +immute_domain: xxx +machine_type: riak +bk_cloud_id: 0 +log: +console: true +log_file_dir: /data/monitor/riak-monitor/logs +debug: true +source: true +json: false +api_url: xxx +items_config_file: /data/monitor/riak-monitor/items-config.yaml +interact_timeout: 2s +default_schedule: '@every 1m' + +4. riak-monitor的items-config.yaml示例: +- name: riak-err-notice + enable: true + schedule: '@every 1m' + machine_type: + - riak +- name: riak-load-health + enable: true + schedule: '@every 1m' + machine_type: + - riak +- name: riak-ring-status + enable: true + schedule: '@every 10s' + machine_type: + - riak +- name: db-up + enable: true + schedule: '@every 10s' + machine_type: + - riak +- name: riak_monitor_heart_beat + enable: true + schedule: '@every 10s' + machine_type: + - riak diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/cmd.go b/dbm-services/riak/db-tools/riak-monitor/cmd/cmd.go new file mode 100644 index 0000000000..5b729f1814 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/cmd.go @@ -0,0 +1,2 @@ +// Package cmd TODO +package cmd diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/init.go b/dbm-services/riak/db-tools/riak-monitor/cmd/init.go new file mode 100644 index 0000000000..e1055154ef --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/init.go @@ -0,0 +1,79 @@ +package cmd + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + + "github.com/natefinch/lumberjack" + "golang.org/x/exp/slog" +) + +var executable string +var executableName string +var executableDir string + +func init() { + executable, _ = os.Executable() + // 获取可执行文件的名称 + executableName = filepath.Base(executable) + // 获取可执行文件的路径 + executableDir = filepath.Dir(executable) +} + +// initLogger 初始化日志格式 +func initLogger(cfg *config.LogConfig) { + var ioWriters []io.Writer + + // console打印日志 + if cfg.Console { + ioWriters = append(ioWriters, os.Stdout) + } + + // 日志文件记录日志 + if cfg.LogFileDir != nil { + if !filepath.IsAbs(*cfg.LogFileDir) { + *cfg.LogFileDir = filepath.Join(executableDir, *cfg.LogFileDir) + } + + err := os.MkdirAll(*cfg.LogFileDir, 0755) + if err != nil { + panic(err) + } + + logFile := filepath.Join(*cfg.LogFileDir, fmt.Sprintf("%s.log", executableName)) + _, err = os.Stat(logFile) + if err != nil { + // 目录不存在创建目录 + if os.IsNotExist(err) { + _, err := os.Create(logFile) + if err != nil { + panic(err) + } + } else { + panic(err) + } + } + ioWriters = append(ioWriters, &lumberjack.Logger{Filename: logFile}) + } + // 日志中添加源头信息,方便定位 + handleOpt := slog.HandlerOptions{AddSource: cfg.Source} + if cfg.Debug { + handleOpt.Level = slog.LevelDebug + } else { + handleOpt.Level = slog.LevelInfo + } + + var logger *slog.Logger + // 设置日志格式 + if cfg.Json { + logger = slog.New(slog.NewJSONHandler(io.MultiWriter(ioWriters...), &handleOpt)) + } else { + logger = slog.New(slog.NewTextHandler(io.MultiWriter(ioWriters...), &handleOpt)) + } + + slog.SetDefault(logger) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/root.go b/dbm-services/riak/db-tools/riak-monitor/cmd/root.go new file mode 100644 index 0000000000..b8912b4643 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/root.go @@ -0,0 +1,27 @@ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" + "golang.org/x/exp/slog" +) + +var rootCmd = &cobra.Command{ + Use: "riak-monitor", + Short: "riak-monitor", +} + +func init() { + // rootCmd.PersistentFlags().StringP("config", "c", "", "config file") + // _ = viper.BindPFlag("config", rootCmd.PersistentFlags().Lookup("config")) +} + +// Execute TODO +func Execute() { + err := rootCmd.Execute() + if err != nil { + slog.Error("start", err) + os.Exit(1) + } +} diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_clean.go b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_clean.go new file mode 100644 index 0000000000..9ea91c7bd9 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_clean.go @@ -0,0 +1,63 @@ +package cmd + +import ( + "strings" + + ma "dbm-services/mysql/db-tools/mysql-crond/api" + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "golang.org/x/exp/slog" +) + +// 清理mysql-crond中riak监控entry,但不包括硬编码。如果要退出监控,可访问mysql-crond的quit接口 +var subCmdClean = &cobra.Command{ + Use: "clean", + Short: "clean all mysql-crond entry", + Long: "clean all mysql-crond entry", + RunE: func(cmd *cobra.Command, args []string) error { + err := config.InitConfig(viper.GetString("clean-config")) + if err != nil { + return err + } + initLogger(config.MonitorConfig.Log) + // 通过mysql-crond的接口删除entry + manager := ma.NewManager(config.MonitorConfig.ApiUrl) + // 获取mysql-crond注册的所有entry + entries, err := manager.Entries() + if err != nil { + slog.Error("clean list entries", err) + return err + } + for _, entry := range entries { + // riak监控的entry,排除硬编码的entry,注意此接口会持久化到crond的配置文件jobs-config.yaml + if strings.HasPrefix(entry.Job.Name, "riak-") && + !strings.Contains(entry.Job.Name, "hardcode") { + eid, err := manager.Delete(entry.Job.Name, true) + if err != nil { + slog.Error( + "delete entry", err, + slog.String("name", entry.Job.Name), + ) + return err + } + slog.Info( + "delete entry", + slog.String("name", entry.Job.Name), + slog.Int("ID", eid), + ) + } + } + return nil + }, +} + +func init() { + subCmdClean.PersistentFlags().StringP("config", "c", "", "config file") + _ = subCmdClean.MarkPersistentFlagRequired("config") + _ = viper.BindPFlag("clean-config", subCmdClean.PersistentFlags().Lookup("config")) + + rootCmd.AddCommand(subCmdClean) + +} diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_hardcode_run.go b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_hardcode_run.go new file mode 100644 index 0000000000..b11bbbf210 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_hardcode_run.go @@ -0,0 +1,49 @@ +package cmd + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + "dbm-services/riak/db-tools/riak-monitor/pkg/mainloop" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "golang.org/x/exp/slog" +) + +// 硬编码,监控启动后基础的定时任务,包括数据库是否启动、心跳上报 +var subCmdHardCodeRun = &cobra.Command{ + Use: "hardcode-run", + Short: "run hardcode monitor items", + Long: "run hardcode monitor items", + RunE: func(cmd *cobra.Command, args []string) error { + err := config.InitConfig(viper.GetString("hard-run-config")) + if err != nil { + return err + } + initLogger(config.MonitorConfig.Log) + // 加载监控items-config.yaml配置文件 + err = config.LoadMonitorItemsConfig() + if err != nil { + slog.Error("run hardcode monitor load items", err) + return err + } + // 执行监控项对应的函数 + err = mainloop.Run(true) + if err != nil { + slog.Error("run monitor hardcode items", err) + return err + } + return nil + }, +} + +func init() { + subCmdHardCodeRun.PersistentFlags().StringP("config", "c", "", "config file") + _ = subCmdHardCodeRun.MarkPersistentFlagRequired("config") + _ = viper.BindPFlag("hard-run-config", subCmdHardCodeRun.PersistentFlags().Lookup("config")) + + subCmdHardCodeRun.PersistentFlags().StringSliceP("items", "", nil, "run items") + _ = subCmdHardCodeRun.MarkPersistentFlagRequired("items") + _ = viper.BindPFlag("hardcode-items", subCmdHardCodeRun.PersistentFlags().Lookup("items")) + + rootCmd.AddCommand(subCmdHardCodeRun) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_run.go b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_run.go new file mode 100644 index 0000000000..7b6f7c581a --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_run.go @@ -0,0 +1,52 @@ +package cmd + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + "dbm-services/riak/db-tools/riak-monitor/pkg/mainloop" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "golang.org/x/exp/slog" +) + +// 根据配置文件以及指定的item,运行监控 +var subCmdRun = &cobra.Command{ + Use: "run", + Short: "run monitor items", + Long: "run monitor items", + RunE: func(cmd *cobra.Command, args []string) error { + // 配置初始化 + err := config.InitConfig(viper.GetString("run-config")) + if err != nil { + return err + } + // 初始化日志配置 + initLogger(config.MonitorConfig.Log) + // 加载监控items-config.yaml配置文件 + err = config.LoadMonitorItemsConfig() + if err != nil { + slog.Error("run monitor load items", err) + return err + } + // 执行监控项 + err = mainloop.Run(false) + if err != nil { + slog.Error("msg", "run monitor items", err) + return err + } + return nil + }, +} + +func init() { + // 配置文件 + subCmdRun.PersistentFlags().StringP("config", "c", "", "config file") + _ = subCmdRun.MarkPersistentFlagRequired("config") + _ = viper.BindPFlag("run-config", subCmdRun.PersistentFlags().Lookup("config")) + // 指定items + subCmdRun.PersistentFlags().StringSliceP("items", "", nil, "run items") + _ = subCmdRun.MarkPersistentFlagRequired("items") + _ = viper.BindPFlag("run-items", subCmdRun.PersistentFlags().Lookup("items")) + + rootCmd.AddCommand(subCmdRun) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_version.go b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_version.go new file mode 100644 index 0000000000..eeb516b6df --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/cmd/subcmd_version.go @@ -0,0 +1,42 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +// versionCmd represents the version command +var subCmdVersion = &cobra.Command{ + Use: "version", + Short: "A brief description of your command", + Long: `A longer description that spans multiple lines and likely contains examples +and usage of using your command. For example: + +Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + Run: func(cmd *cobra.Command, args []string) { + printVersion() + }, +} +var version = "" +var buildStamp = "" +var gitHash = "" + +func init() { + rootCmd.AddCommand(subCmdVersion) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // versionCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // versionCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} +func printVersion() { + fmt.Printf("Version: %s, GitHash: %s, BuildAt: %s\n", version, gitHash, buildStamp) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/config.yaml b/dbm-services/riak/db-tools/riak-monitor/config.yaml new file mode 100644 index 0000000000..5347f41f93 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/config.yaml @@ -0,0 +1,17 @@ +bk_biz_id: xxx +ip: xxx +port: xxx +bk_instance_id: xxx +immute_domain: xxx +machine_type: riak +bk_cloud_id: xxx +log: + console: true + log_file_dir: /data/monitor/riak-monitor/logs + debug: true + source: true + json: false +api_url: http://127.0.0.1:9999 +items_config_file: /data/monitor/riak-monitor/items-config.yaml +interact_timeout: 2s +default_schedule: '@every 1m' diff --git a/dbm-services/riak/db-tools/riak-monitor/config.yaml.go.tpl b/dbm-services/riak/db-tools/riak-monitor/config.yaml.go.tpl new file mode 100644 index 0000000000..b0488e6e7f --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/config.yaml.go.tpl @@ -0,0 +1,17 @@ +bk_biz_id: {{ .BkBizId }} +ip: {{ .IP }} +port: {{ .Port }} +bk_instance_id: {{ .BkInstanceId }} +immute_domain: {{ .ImmuteDomain }} +machine_type: {{ .MachineType }} +bk_cloud_id: {{ .BkCloudId }} +log: + console: true + log_file_dir: {{ .LogPath }} + debug: true + source: true + json: false +api_url: http://127.0.0.1:9999 +items_config_file: {{ .ItemsConfigPath }} +interact_timeout: 2s +default_schedule: '@every 1m' diff --git a/dbm-services/riak/db-tools/riak-monitor/go.mod b/dbm-services/riak/db-tools/riak-monitor/go.mod new file mode 100644 index 0000000000..ed8b8eb031 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/go.mod @@ -0,0 +1,38 @@ +module dbm-services/riak/db-tools/riak-monitor + +go 1.19 + +require ( + github.com/dlclark/regexp2 v1.10.0 + github.com/go-playground/validator v9.31.0+incompatible + github.com/go-sql-driver/mysql v1.7.1 + github.com/natefinch/lumberjack v2.0.0+incompatible + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.7.0 + github.com/spf13/viper v1.16.0 + golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 + gopkg.in/yaml.v2 v2.4.0 +) + +require ( + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + gopkg.in/go-playground/assert.v1 v1.2.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/dbm-services/riak/db-tools/riak-monitor/go.sum b/dbm-services/riak/db-tools/riak-monitor/go.sum new file mode 100644 index 0000000000..cd57c03fda --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/go.sum @@ -0,0 +1,512 @@ +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 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +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/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/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= +github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +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/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +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-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator v9.31.0+incompatible h1:UA72EPEogEnq76ehGdEDp4Mit+3FDh548oRqwVgNsHA= +github.com/go-playground/validator v9.31.0+incompatible/go.mod h1:yrEkQXlcI+PugkyDjY2bRrL/UBU4f3rvrgkN3V8JEig= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +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/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/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +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.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/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/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +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/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +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.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +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/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +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/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= +github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +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.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +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.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.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/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +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.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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/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/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY= +golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +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/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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +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-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/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/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-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-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-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-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +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-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-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/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/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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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.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= diff --git a/dbm-services/riak/db-tools/riak-monitor/items-config.yaml b/dbm-services/riak/db-tools/riak-monitor/items-config.yaml new file mode 100644 index 0000000000..fe03fedc04 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/items-config.yaml @@ -0,0 +1,25 @@ +- name: riak-err-notice + enable: true + schedule: '@every 1m' + machine_type: + - riak +- name: riak-load-health + enable: true + schedule: '@every 1m' + machine_type: + - riak +- name: riak-ring-status + enable: true + schedule: '@every 10s' + machine_type: + - riak +- name: db-up + enable: true + schedule: '@every 10s' + machine_type: + - riak +- name: riak_monitor_heart_beat + enable: true + schedule: '@every 10s' + machine_type: + - riak diff --git a/dbm-services/riak/db-tools/riak-monitor/main.go b/dbm-services/riak/db-tools/riak-monitor/main.go new file mode 100644 index 0000000000..17178c7c87 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/main.go @@ -0,0 +1,8 @@ +package main + +import "dbm-services/riak/db-tools/riak-monitor/cmd" + +func main() { + // 执行命令行指令 + cmd.Execute() +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/config/config.go b/dbm-services/riak/db-tools/riak-monitor/pkg/config/config.go new file mode 100644 index 0000000000..f0e566976e --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/config/config.go @@ -0,0 +1,2 @@ +// Package config 配置 +package config diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/config/init.go b/dbm-services/riak/db-tools/riak-monitor/pkg/config/init.go new file mode 100644 index 0000000000..f358a64660 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/config/init.go @@ -0,0 +1,142 @@ +package config + +import ( + "os" + "path/filepath" + + "github.com/go-playground/validator" + "golang.org/x/exp/slog" + "gopkg.in/yaml.v2" +) + +var HeartBeatName = "riak_monitor_heart_beat" +var MonitorConfig *monitorConfig +var ItemsConfig []*MonitorItem +var HardCodeSchedule = "@every 10s" + +// InitConfig 配置初始化 +func InitConfig(configPath string) error { + slog.Info("msg", "config path", configPath) + if !filepath.IsAbs(configPath) { + cwd, err := os.Getwd() + if err != nil { + slog.Error("init config", err) + return err + } + + configPath = filepath.Join(cwd, configPath) + } + slog.Info("msg", "absolute config path", configPath) + + content, err := os.ReadFile(configPath) + if err != nil { + slog.Error("init config", err) + return err + } + + slog.Info("msg", "content", string(content)) + MonitorConfig = &monitorConfig{} + slog.Info("msg", "MonitorConfig", MonitorConfig) + err = yaml.UnmarshalStrict(content, MonitorConfig) + if err != nil { + slog.Error("config file content", string(content)) + slog.Error("init config", err) + return err + } + validate := validator.New() + err = validate.Struct(MonitorConfig) + if err != nil { + slog.Error("validate monitor config", err) + return err + } + + return nil +} + +// LoadMonitorItemsConfig 加载监控项配置 +func LoadMonitorItemsConfig() error { + ItemsConfig = make([]*MonitorItem, 0) + + content, err := os.ReadFile(MonitorConfig.ItemsConfigFile) + if err != nil { + slog.Error("load monitor items config", err) + return err + } + + err = yaml.UnmarshalStrict(content, &ItemsConfig) + if err != nil { + slog.Error("unmarshal monitor items config", err) + return err + } + + validate := validator.New() + for _, ele := range ItemsConfig { + err := validate.Struct(ele) + if err != nil { + slog.Error("validate monitor items config", err) + return err + } + } + + return nil +} + +// InjectHardCodeItem 注入硬编码的心跳和db-up监控 +func InjectHardCodeItem() { + enable := true + dbUpItem := &MonitorItem{ + Name: "db-up", + Enable: &enable, + Schedule: &HardCodeSchedule, //&MonitorConfig.DefaultSchedule, + MachineType: []string{MonitorConfig.MachineType}, + } + heartBeatItem := &MonitorItem{ + Name: HeartBeatName, + Enable: &enable, + Schedule: &HardCodeSchedule, //&MonitorConfig.DefaultSchedule, + MachineType: []string{MonitorConfig.MachineType}, + } + slog.Debug("load monitor item", slog.Any("items", ItemsConfig)) + + ItemsConfig = injectItem(dbUpItem, ItemsConfig) + slog.Debug("inject hardcode", slog.Any("items", ItemsConfig)) + + ItemsConfig = injectItem(heartBeatItem, ItemsConfig) + slog.Debug("inject hardcode", slog.Any("items", ItemsConfig)) +} + +func injectItem(item *MonitorItem, collect []*MonitorItem) (res []*MonitorItem) { + for i, ele := range collect { + if ele.Name == item.Name { + // 如果已经在配置文件, 保留 enable 配置, 其他覆盖为默认配置 + res = append(collect[:i], collect[i+1:]...) + item.Enable = ele.Enable + return append(res, item) + } + } + + return append(collect, item) +} + +// WriteMonitorItemsBack 回写监控项到文件 +func WriteMonitorItemsBack() error { + // 注入硬编码监控项后回写items文件 + content, err := yaml.Marshal(ItemsConfig) + if err != nil { + slog.Error("marshal items config", err) + return err + } + + f, err := os.OpenFile(MonitorConfig.ItemsConfigFile, os.O_TRUNC|os.O_WRONLY, 0755) + if err != nil { + slog.Error("open items config file", err) + return err + } + + _, err = f.Write(content) + if err != nil { + slog.Error("write items config file", err) + return err + } + return nil +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/config/items_config.go b/dbm-services/riak/db-tools/riak-monitor/pkg/config/items_config.go new file mode 100644 index 0000000000..98db2ccccc --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/config/items_config.go @@ -0,0 +1,21 @@ +package config + +import "golang.org/x/exp/slices" + +// MonitorItem 监控项 +type MonitorItem struct { + Name string `yaml:"name" validate:"required"` + Enable *bool `yaml:"enable" validate:"required"` + Schedule *string `yaml:"schedule"` + MachineType []string `yaml:"machine_type"` +} + +// IsEnable 监控项启用 +func (c *MonitorItem) IsEnable() bool { + return c.Enable != nil && *c.Enable +} + +// IsMatchMachineType 机器类型匹配 +func (c *MonitorItem) IsMatchMachineType() bool { + return slices.Index(c.MachineType, MonitorConfig.MachineType) >= 0 +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/config/log_config.go b/dbm-services/riak/db-tools/riak-monitor/pkg/config/log_config.go new file mode 100644 index 0000000000..f5ca53f03d --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/config/log_config.go @@ -0,0 +1,13 @@ +package config + +// LogConfig 日志配置 +type LogConfig struct { + // 是否console输出 + Console bool `yaml:"console"` + // 位置 + LogFileDir *string `yaml:"log_file_dir"` + Debug bool `yaml:"debug"` + // 是否打印日志源头信息 + Source bool `yaml:"source"` + Json bool `yaml:"json"` +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/config/monitor_config.go b/dbm-services/riak/db-tools/riak-monitor/pkg/config/monitor_config.go new file mode 100644 index 0000000000..dec2af5b20 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/config/monitor_config.go @@ -0,0 +1,25 @@ +package config + +import ( + "time" +) + +type monitorConfig struct { + BkBizId int `yaml:"bk_biz_id"` + Ip string `yaml:"ip" validate:"required,ipv4"` + Port int `yaml:"port" validate:"required,gt=1024,lte=65535"` + BkInstanceId int64 `yaml:"bk_instance_id" validate:"required,gt=0"` + ImmuteDomain string `yaml:"immute_domain"` + MachineType string `yaml:"machine_type"` + BkCloudID *int `yaml:"bk_cloud_id" validate:"required,gte=0"` + // 日志配置项 + Log *LogConfig `yaml:"log"` + // items-config.yaml 路径 + ItemsConfigFile string `yaml:"items_config_file" validate:"required"` + // crond的访问url + ApiUrl string `yaml:"api_url" validate:"required"` + // 超时时间 + InteractTimeout time.Duration `yaml:"interact_timeout" validate:"required"` + // 调度频率 + DefaultSchedule string `yaml:"default_schedule" validate:"required"` +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst/const.go b/dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst/const.go new file mode 100644 index 0000000000..67c05d39c1 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst/const.go @@ -0,0 +1,10 @@ +package cst + +const ( + // RiakMachineType 机器类型 + RiakMachineType = "riak" + // RiakHttpPort http端口 + RiakHttpPort = 8098 + // RiakAdminPath 管理指令 + RiakAdminPath = "/usr/sbin/riak-admin" +) diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst/cst.go b/dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst/cst.go new file mode 100644 index 0000000000..f558488b06 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst/cst.go @@ -0,0 +1,2 @@ +// Package cst TODO +package cst diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload/check_load.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload/check_load.go new file mode 100644 index 0000000000..df8f131a4a --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload/check_load.go @@ -0,0 +1,57 @@ +package checkload + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst" + "dbm-services/riak/db-tools/riak-monitor/pkg/utils" + "encoding/json" + "fmt" + "strings" + + "golang.org/x/exp/slog" +) + +func CheckResponseTime() (string, error) { + item := `^node_put_fsm_time_mean|^node_get_fsm_time_mean|^node_put_fsm_rejected|^node_get_fsm_rejected` + format := `awk '{print "\""$1"\" "$3}' | awk '{printf("%s: %s,",$1,$2)}' | sed "{s/,$/\}/g}" | sed "{s/^/{/g}"` + cmd := fmt.Sprintf(`%s status | grep -E '%s' | grep -E -v '_60s|_total' | %s`, cst.RiakAdminPath, item, format) + resp, err := utils.ExecShellCommand(false, cmd) + if err != nil { + // 这个检查项是在此riak节点运行时,执行集群ring检查,发现其他异常节点;如果此节点异常,检查联通性时可探测到 + if strings.Contains(err.Error(), "Node did not respond to ping!") { + slog.Warn(fmt.Sprintf("check load. execute [ %s ] error: %s.", cmd, err.Error())) + return "", nil + } else { + errInfo := fmt.Sprintf("check load. execute [ %s ] error: %s", cmd, err.Error()) + return "", fmt.Errorf(errInfo) + } + } + type CheckItems struct { + GetTime int `json:"node_get_fsm_time_mean"` // 客户端发起GET请求到收到响应时间间隔的均值,微妙 + PutTime int `json:"node_put_fsm_time_mean"` // 客户端发起PUT请求到收到响应时间间隔的均值,微妙 + GetRejectedNum int `json:"node_get_fsm_rejected"` // 被过载保护主动拒绝的GET FSM数量 + PutRejectedNum int `json:"node_put_fsm_rejected"` // 被过载保护主动拒绝的PUT FSM数量 + } + var items CheckItems + if err = json.Unmarshal([]byte(resp), &items); err != nil { + err = fmt.Errorf("unmarshall %s to %+v get an error:%s", resp, items, err.Error()) + slog.Error(err.Error()) + return "", err + } + var errList []string + if items.GetTime > 300000 { + errList = append(errList, fmt.Sprintf("get response time over than 0.3s")) + } + if items.PutTime > 500000 { + errList = append(errList, fmt.Sprintf("put response time over than 0.5s")) + } + if items.GetRejectedNum > 0 { + errList = append(errList, fmt.Sprintf("overload protection, get was rejected")) + } + if items.PutRejectedNum > 0 { + errList = append(errList, fmt.Sprintf("overload protection, put was rejected")) + } + if len(errList) > 0 { + return "", fmt.Errorf(strings.Join(errList, ",")) + } + return "", nil +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload/init.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload/init.go new file mode 100644 index 0000000000..c3326c51f5 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload/init.go @@ -0,0 +1,45 @@ +package checkload + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface" + "fmt" + + "github.com/pkg/errors" +) + +var NameCheckLoadHealth = "riak-load-health" + +func init() {} + +// Checker TODO +type Checker struct { + name string + f func() (string, error) +} + +// Run TODO +func (c *Checker) Run() (msg string, err error) { + msg, err = c.f() + if err != nil { + return "", errors.Wrap(err, fmt.Sprintf("run %s", c.name)) + } + return msg, nil +} + +// Name TODO +func (c *Checker) Name() string { + return c.name +} + +// NewCheckLoadHealth TODO +func NewCheckLoadHealth(cc *monitoriteminterface.ConnectionCollect) monitoriteminterface.MonitorItemInterface { + return &Checker{ + name: NameCheckLoadHealth, + f: CheckResponseTime, + } +} + +// RegisterCheckLoadHealth TODO +func RegisterCheckLoadHealth() (string, monitoriteminterface.MonitorItemConstructorFuncType) { + return NameCheckLoadHealth, NewCheckLoadHealth +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus/init.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus/init.go new file mode 100644 index 0000000000..d2f3e45974 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus/init.go @@ -0,0 +1,45 @@ +package checkringstatus + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface" + "fmt" + + "github.com/pkg/errors" +) + +var NameCheckRingStatus = "riak-ring-status" + +func init() {} + +// Checker TODO +type Checker struct { + name string + f func() (string, error) +} + +// Run TODO +func (c *Checker) Run() (msg string, err error) { + msg, err = c.f() + if err != nil { + return "", errors.Wrap(err, fmt.Sprintf("run %s", c.name)) + } + return msg, nil +} + +// Name TODO +func (c *Checker) Name() string { + return c.name +} + +// NewCheckRingStatus TODO +func NewCheckRingStatus(cc *monitoriteminterface.ConnectionCollect) monitoriteminterface.MonitorItemInterface { + return &Checker{ + name: NameCheckRingStatus, + f: CheckRingStatus, + } +} + +// RegisterCheckRingStatus TODO +func RegisterCheckRingStatus() (string, monitoriteminterface.MonitorItemConstructorFuncType) { + return NameCheckRingStatus, NewCheckRingStatus +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus/riak_ring_status.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus/riak_ring_status.go new file mode 100644 index 0000000000..cfbbbb9854 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus/riak_ring_status.go @@ -0,0 +1,37 @@ +package checkringstatus + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst" + "dbm-services/riak/db-tools/riak-monitor/pkg/utils" + "fmt" + "regexp" + "strings" + + "golang.org/x/exp/slog" +) + +func CheckRingStatus() (string, error) { + cmd := fmt.Sprintf("%s ringready", cst.RiakAdminPath) + resp, err := utils.ExecShellCommand(false, cmd) + if err != nil { + // 这个检查项是在此riak节点运行时,执行集群ring检查,发现其他异常节点;如果此节点异常,检查联通性时可探测到 + if strings.Contains(err.Error(), "Node did not respond to ping!") { + slog.Warn(fmt.Sprintf("execute [ %s ] error: %s.", cmd, err.Error())) + } else if strings.Contains(resp, "FALSE") { + // FALSE ['riak@xxx','riak@xxx'] down. All nodes need to be up to check. + slog.Error(resp) + re := regexp.MustCompile(`\[[^[]*\] down`) + matchArr := re.FindStringSubmatch(resp) + if len(matchArr) == 1 { + return "", fmt.Errorf(matchArr[0]) + } else { + return "", fmt.Errorf(resp) + } + } else { + errInfo := fmt.Sprintf("execute [ %s ] error: %s", cmd, err.Error()) + slog.Error(errInfo) + return "", fmt.Errorf(errInfo) + } + } + return "", nil +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/items_collect.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/items_collect.go new file mode 100644 index 0000000000..d7f7b69f8a --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/items_collect.go @@ -0,0 +1,50 @@ +// TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +// Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// Package itemscollect 监控项 +package itemscollect + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkload" + "dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/checkringstatus" + "dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog" + "fmt" + + mi "dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface" + + "golang.org/x/exp/slog" +) + +var registeredItemConstructor map[string]func(*mi.ConnectionCollect) mi.MonitorItemInterface + +func registerItemConstructor( + name string, f func(*mi.ConnectionCollect) mi.MonitorItemInterface, +) error { + if _, ok := registeredItemConstructor[name]; ok { + err := fmt.Errorf("%s already registered", name) + slog.Error("register item creator", err) + return err + } + registeredItemConstructor[name] = f + return nil +} + +// RegisteredItemConstructor 返回注册列表 +func RegisteredItemConstructor() map[string]func(*mi.ConnectionCollect) mi.MonitorItemInterface { + return registeredItemConstructor +} + +func init() { + registeredItemConstructor = make(map[string]func(*mi.ConnectionCollect) mi.MonitorItemInterface) + /* + 注册监控项 + */ + _ = registerItemConstructor(riakconsolelog.RegisterRiakErrNotice()) + _ = registerItemConstructor(checkringstatus.RegisterCheckRingStatus()) + _ = registerItemConstructor(checkload.RegisterCheckLoadHealth()) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog/init.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog/init.go new file mode 100644 index 0000000000..5d3564b9a3 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog/init.go @@ -0,0 +1,44 @@ +// TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +// Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package riakconsolelog + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface" +) + +var nameRiakErrNotice = "riak-err-notice" + +// Checker TODO +type Checker struct { + name string + f func() (string, error) +} + +// Run TODO +func (c *Checker) Run() (msg string, err error) { + return c.f() +} + +// Name TODO +func (c *Checker) Name() string { + return c.name +} + +// NewRiakErrNotice TODO +func NewRiakErrNotice(cc *monitoriteminterface.ConnectionCollect) monitoriteminterface.MonitorItemInterface { + return &Checker{ + name: nameRiakErrNotice, + f: riakNotice, + } +} + +// RegisterRiakErrNotice TODO +func RegisterRiakErrNotice() (string, monitoriteminterface.MonitorItemConstructorFuncType) { + return nameRiakErrNotice, NewRiakErrNotice +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog/riak_notice.go b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog/riak_notice.go new file mode 100644 index 0000000000..62bd373133 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect/riakconsolelog/riak_notice.go @@ -0,0 +1,200 @@ +// TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +// Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package riakconsolelog + +import ( + "bufio" + "dbm-services/riak/db-tools/riak-monitor/pkg/utils" + "fmt" + "os" + "path" + "path/filepath" + "strconv" + "strings" + "time" + + "golang.org/x/exp/slog" + + "github.com/dlclark/regexp2" +) + +var executable string +var offsetRegFile string +var rowStartPattern *regexp2.Regexp +var riakNoticePattern *regexp2.Regexp +var riakNoticeIgnorePattern *regexp2.Regexp + +func riakNotice() (string, error) { + return ScanLog() +} + +func init() { + executable, _ = os.Executable() + offsetRegFile = filepath.Join(filepath.Dir(executable), "console_log_offset.reg") + now := time.Now() + rowStartPattern = regexp2.MustCompile( + fmt.Sprintf( + `^(?=(?:(%s|%s|%s)))`, + now.Format("2006-01-02"), + now.Format("060102"), + now.Format("20060102"), + ), + regexp2.None, + ) + riakNoticePattern = regexp2.MustCompile( + fmt.Sprintf( + `(?=(?:(%s)))`, + strings.Join( + []string{"error", "fatal"}, + "|", + ), + ), + regexp2.IgnoreCase, + ) + riakNoticeIgnorePattern = regexp2.MustCompile( + fmt.Sprintf( + `(?=(?:(%s)))`, + strings.Join( + []string{"Unrecognized message", + "no function clause matching webmachine_request", + "too many siblings for object"}, + "|", + ), + ), + regexp2.IgnoreCase, + ) +} + +// ScanLog 扫描日志 +func ScanLog() (string, error) { + consoleLogPath, err := findConsoleLogFile() + if err != nil { + return "", err + } + file, offset, err := newScanner(consoleLogPath) + scanner := bufio.NewScanner(file) + var lines, infos []string + // 逐行扫描日志文件 + for scanner.Scan() { + content := scanner.Bytes() + line := scanner.Text() + lines = append(lines, line) + offset += int64(len(content)) + 1 + } + file.Close() + for _, line := range lines { + match, err := rowStartPattern.MatchString(line) + if err != nil { + slog.Error( + "apply row pattern", err, slog.String("pattern", rowStartPattern.String()), + ) + continue + } + // 非完整一行的读取不做判断 + if !match { + continue + } + // 匹配报错信息 + match, err = riakNoticePattern.MatchString(line) + if err != nil { + slog.Error( + "apply pattern", err, slog.String("pattern", riakNoticePattern.String()), + ) + } + if match { + // 应该忽略的报错信息 + matchignore, err := riakNoticeIgnorePattern.MatchString(line) + if err != nil { + slog.Error( + "apply ignore pattern", err, slog.String("ignore pattern", riakNoticeIgnorePattern.String()), + ) + } + if !matchignore { + infos = append(infos, line) + } + } + } + // 更新offsetRegFile文件中,下次读取开始的位置 + f, err := os.OpenFile(offsetRegFile, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0755) + if err != nil { + slog.Error("open offset reg", err) + return "", err + } + _, err = f.WriteString(strconv.FormatInt(offset, 10)) + if err != nil { + slog.Error("update offset reg", err) + return "", err + } + if len(infos) > 0 { + return strings.Join(infos, "\n"), nil + } + return "", nil +} + +func findConsoleLogFile() (string, error) { + cmd := `/usr/sbin/riak config effective | grep '^platform_log_dir' | cut -d '=' -f2 | awk '{print $1}'` + LogPath, err := utils.ExecShellCommand(false, cmd) + if err != nil { + slog.Error("get riak log error", err) + return LogPath, err + } + LogPath = strings.ReplaceAll(LogPath, "\n", "") + return path.Join(LogPath, "console.log"), nil +} + +func newScanner(logPath string) (*os.File, int64, error) { + f, err := os.Open(logPath) + if err != nil { + slog.Error("open console log", err) + return nil, 0, err + } + + st, err := f.Stat() + if err != nil { + slog.Error("stat of console log", err) + return nil, 0, err + } + consoleLogSize := st.Size() + + lastOffset, err := lastRoundOffset() + if err != nil { + return nil, 0, err + } + + // errlog 应该是被 rotate 了 + if consoleLogSize < lastOffset { + lastOffset = 0 + } + + // 从lastOffset开始读取文件 + offset, err := f.Seek(lastOffset, 0) + if err != nil { + slog.Error("seek err log", err) + return nil, 0, err + } + return f, offset, nil +} + +func lastRoundOffset() (int64, error) { + content, err := os.ReadFile(offsetRegFile) + if err != nil { + if os.IsNotExist(err) { + return 0, nil + } + slog.Error("read offset reg", err, slog.String("file", offsetRegFile)) + return 0, err + } + + r, err := strconv.ParseInt(string(content), 10, 64) + if err != nil { + slog.Error("parse last offset", err) + return 0, err + } + return r, nil +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/mainloop/main_loop.go b/dbm-services/riak/db-tools/riak-monitor/pkg/mainloop/main_loop.go new file mode 100644 index 0000000000..5293223685 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/mainloop/main_loop.go @@ -0,0 +1,87 @@ +// TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +// Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// Package mainloop 主循环 +package mainloop + +import ( + "fmt" + "strings" + + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + "dbm-services/riak/db-tools/riak-monitor/pkg/itemscollect" + "dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface" + "dbm-services/riak/db-tools/riak-monitor/pkg/utils" + + _ "github.com/go-sql-driver/mysql" // mysql TODO + "github.com/pkg/errors" + "github.com/spf13/viper" + "golang.org/x/exp/slices" + "golang.org/x/exp/slog" +) + +// Run TODO +func Run(hardcode bool) error { + var iNames []string + if hardcode { + iNames = viper.GetStringSlice("hardcode-items") + } else { + iNames = viper.GetStringSlice("run-items") + } + slog.Info("main loop", slog.String("items", strings.Join(iNames, ","))) + slog.Info("main loop", slog.Bool("hardcode", hardcode)) + + if hardcode && slices.Index(iNames, config.HeartBeatName) >= 0 { + utils.SendMonitorMetrics(config.HeartBeatName, 1, nil) + } + + cc, err := monitoriteminterface.NewConnectionCollect() + if err != nil { + if hardcode && slices.Index(iNames, "db-up") >= 0 { + utils.SendMonitorEvent("db-up", err.Error()) + } + return nil + } + + if hardcode { + return nil + } + + for _, iName := range iNames { + + if constructor, ok := itemscollect.RegisteredItemConstructor()[iName]; ok { + msg, err := constructor(cc).Run() + if err != nil { + slog.Error("run monitor item", err, slog.String("name", iName)) + utils.SendMonitorEvent( + "monitor-internal-error", + fmt.Sprintf("run monitor item %s failed: %s", iName, err.Error()), + ) + continue + } + + if msg != "" { + slog.Info( + "run monitor items", + slog.String("name", iName), + slog.String("msg", msg), + ) + utils.SendMonitorEvent(iName, msg) + continue + } + + slog.Info("run monitor item pass", slog.String("name", iName)) + + } else { + err := errors.Errorf("%s not registered", iName) + slog.Error("run monitor item", err) + continue + } + } + return nil +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface/connection_collect.go b/dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface/connection_collect.go new file mode 100644 index 0000000000..c88e2fe36c --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface/connection_collect.go @@ -0,0 +1,95 @@ +// TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +// Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package monitoriteminterface + +import ( + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + "dbm-services/riak/db-tools/riak-monitor/pkg/internal/cst" + "dbm-services/riak/db-tools/riak-monitor/pkg/utils" + "fmt" + "strings" + "time" + + "golang.org/x/exp/slog" +) + +// ConnectionCollect DB连接对象 +type ConnectionCollect struct { +} + +// NewConnectionCollect 新建连接 +func NewConnectionCollect() (*ConnectionCollect, error) { + if config.MonitorConfig.MachineType == cst.RiakMachineType { + err := ConnectDB( + config.MonitorConfig.Ip, + ) + if err != nil { + slog.Error( + fmt.Sprintf("connect error: %s", config.MonitorConfig.MachineType), err, + slog.String("ip", config.MonitorConfig.Ip), + slog.Int("port", config.MonitorConfig.Port), + ) + return nil, err + } + } + return nil, nil +} + +func ConnectDB(ip string) error { + recheck := 1 + var riakErr error + for i := 0; i <= recheck; i++ { + // 设置缓冲为1防止没有接收者导致阻塞,即Detection已经超时返回 + errChan := make(chan error, 2) + // 这里存在资源泄露的可能,因为不能主动kill掉协程,所以如果这个协程依然阻塞在连接riak,但是 + // 这个函数已经超时返回了,那么这个协程因为被阻塞一直没被释放,直到Riak连接超时,如果阻塞的时间 + // 大于下次探测该实例的时间间隔,则创建协程频率大于释放协程频率,可能会导致oom。可以考虑在Riak + // 客户端连接设置超时时间来防止。 + go CheckRiak(ip, int(config.MonitorConfig.InteractTimeout.Seconds()), errChan) + select { + case riakErr = <-errChan: + if riakErr != nil { + slog.Error(fmt.Sprintf("The Node is out of service:%s.", riakErr.Error())) + } else { + return nil + } + case <-time.After(config.MonitorConfig.InteractTimeout): + slog.Error(fmt.Sprintf("Connect Riak timeout recheck:%d", recheck)) + riakErr = fmt.Errorf(`['riak@%s'] down`, ip) + } + } + return riakErr +} + +// CheckRiak check whether riak alive +func CheckRiak(ip string, timeout int, errChan chan error) { + foundNothing := "riak down, query heartbeat nothing return" + down := fmt.Errorf(`['riak@%s'] down`, ip) + query := fmt.Sprintf(`curl -s --connect-timeout %d -m %d http://%s:%d/types/default/buckets/test/keys/1000`, + timeout, timeout, ip, cst.RiakHttpPort) + insert := fmt.Sprintf( + `%s -X PUT -H 'Content-Type: application/json' -d '{name: "DBATeam", members: 31}'`, query) + _, err := utils.ExecShellCommand(false, insert) + if err != nil { + slog.Warn(fmt.Sprintf("Execute [ %s ] error: %s.", insert, err.Error())) + errChan <- down + return + } + stdout, err := utils.ExecShellCommand(false, query) + if err != nil { + slog.Warn(fmt.Sprintf(" Execute [ %s ] error: %s", query, err.Error())) + errChan <- down + return + } else if strings.Contains(stdout, "not found") { + slog.Warn(fmt.Sprintf("%s. Execute [ %s ]", foundNothing, query)) + errChan <- down + return + } + errChan <- nil +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface/monitor_item_interface.go b/dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface/monitor_item_interface.go new file mode 100644 index 0000000000..d96fe3d03b --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/monitoriteminterface/monitor_item_interface.go @@ -0,0 +1,11 @@ +// Package monitoriteminterface 监控项接口 +package monitoriteminterface + +// MonitorItemInterface TODO +type MonitorItemInterface interface { + Run() (msg string, err error) + Name() string +} + +// MonitorItemConstructorFuncType TODO +type MonitorItemConstructorFuncType func(cc *ConnectionCollect) MonitorItemInterface diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/utils/send_monitor_event.go b/dbm-services/riak/db-tools/riak-monitor/pkg/utils/send_monitor_event.go new file mode 100644 index 0000000000..bead1335da --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/utils/send_monitor_event.go @@ -0,0 +1,43 @@ +package utils + +import ( + "strconv" + + ma "dbm-services/mysql/db-tools/mysql-crond/api" + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + + "golang.org/x/exp/slog" +) + +// SendMonitorEvent 向蓝鲸监控发送监控事件 +func SendMonitorEvent(name string, msg string) { + // 借助crond发送监控的信息 + crondManager := ma.NewManager(config.MonitorConfig.ApiUrl) + + // 事件的维度信息 + additionDimension := map[string]interface{}{ + "immute_domain": config.MonitorConfig.ImmuteDomain, + "machine_type": config.MonitorConfig.MachineType, + "bk_cloud_id": *config.MonitorConfig.BkCloudID, + "port": config.MonitorConfig.Port, + // 实例id + "bk_target_service_instance_id": strconv.FormatInt(config.MonitorConfig.BkInstanceId, 10), + } + + err := crondManager.SendEvent( + name, + msg, + additionDimension, + ) + if err != nil { + slog.Error( + "send event", err, + slog.String("name", name), slog.String("msg", msg), + ) + } + + slog.Info( + "send event", + slog.String("name", name), slog.String("msg", msg), + ) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/utils/send_monitor_metrics.go b/dbm-services/riak/db-tools/riak-monitor/pkg/utils/send_monitor_metrics.go new file mode 100644 index 0000000000..190e88d97f --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/utils/send_monitor_metrics.go @@ -0,0 +1,46 @@ +package utils + +import ( + "strconv" + + ma "dbm-services/mysql/db-tools/mysql-crond/api" + "dbm-services/riak/db-tools/riak-monitor/pkg/config" + + "golang.org/x/exp/maps" + "golang.org/x/exp/slog" +) + +// SendMonitorMetrics 向蓝鲸监控发送监控指标,用于发送心跳 +func SendMonitorMetrics(name string, value int64, customDimension map[string]interface{}) { + // 借助crond发送监控的信息 + crondManager := ma.NewManager(config.MonitorConfig.ApiUrl) + // 指标的维度信息 + additionDimension := map[string]interface{}{ + "immute_domain": config.MonitorConfig.ImmuteDomain, + "machine_type": config.MonitorConfig.MachineType, + "bk_cloud_id": strconv.Itoa(*config.MonitorConfig.BkCloudID), + "port": strconv.Itoa(config.MonitorConfig.Port), + "bk_target_service_instance_id": strconv.FormatInt(config.MonitorConfig.BkInstanceId, 10), + } + + if customDimension != nil { + maps.Copy(additionDimension, customDimension) + } + + err := crondManager.SendMetrics( + name, + value, + additionDimension, + ) + if err != nil { + slog.Error( + "send metrics", err, + slog.String("name", name), slog.Int64("value", value), + ) + } + + slog.Info( + "send metrics", + slog.String("name", name), slog.Int64("msg", value), + ) +} diff --git a/dbm-services/riak/db-tools/riak-monitor/pkg/utils/utils.go b/dbm-services/riak/db-tools/riak-monitor/pkg/utils/utils.go new file mode 100644 index 0000000000..f76e345e74 --- /dev/null +++ b/dbm-services/riak/db-tools/riak-monitor/pkg/utils/utils.go @@ -0,0 +1,38 @@ +// Package utils TODO +package utils + +import ( + "bytes" + "fmt" + "os/exec" + + "github.com/pkg/errors" +) + +// ExecShellCommand 执行 shell 命令 +// 如果有 err, 返回 stderr; 如果没有 err 返回的是 stdout +// 后续尽量不要用这个方法,因为通过标准错误来判断有点不靠谱 +func ExecShellCommand(isSudo bool, param string) (stdoutStr string, err error) { + if isSudo { + param = "sudo " + param + } + cmd := exec.Command("bash", "-c", param) + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err = cmd.Run() + if err != nil { + if len(stderr.String()) > 0 { + return stderr.String(), errors.WithMessage(err, stderr.String()) + } else { + return stdout.String(), errors.WithMessage(err, stderr.String()) + } + } + + if len(stderr.String()) > 0 { + err = fmt.Errorf("execute shell command(%s) error:%s", param, stderr.String()) + return stderr.String(), err + } + + return stdout.String(), nil +} diff --git a/dbm-ui/backend/flow/consts.py b/dbm-ui/backend/flow/consts.py index 229477efbb..ee984b5951 100644 --- a/dbm-ui/backend/flow/consts.py +++ b/dbm-ui/backend/flow/consts.py @@ -224,6 +224,7 @@ class MediumEnum(str, StructuredEnum): Spider = EnumField("spider", _("spider节点名称")) tdbCtl = EnumField("tdbctl", _("spider中控节点名称")) Riak = EnumField("riak", _("riak")) + RiakMonitor = EnumField("riak-monitor", _("riak-monitor")) RedisDts = EnumField("redis-dts", _("redis-dts")) TBinlogDumper = EnumField("tbinlogdumper", _("tbinlogdumper实例")) @@ -474,6 +475,9 @@ class RiakActuatorActionEnum(str, StructuredEnum): UnInstall = EnumField("uninstall", _("uninstall")) Start = EnumField("start", _("start")) Stop = EnumField("stop", _("stop")) + DeployMonitor = EnumField("deploy-monitor", _("deploy-monitor")) + StartMonitor = EnumField("start-monitor", _("start-monitor")) + StopMonitor = EnumField("stop-monitor", _("stop-monitor")) class RiakModuleId(int, StructuredEnum): diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/common/get_file_list.py b/dbm-ui/backend/flow/engine/bamboo/scene/common/get_file_list.py index 7f64c20379..ad277c827f 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/common/get_file_list.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/common/get_file_list.py @@ -118,15 +118,15 @@ def riak_install_package(self, db_version: str) -> list: riak安装需要的安装包列表 """ riak_pkg = Package.get_latest_package(version=db_version, pkg_type=MediumEnum.Riak, db_type=DBType.Riak) - # riak_crond_pkg = Package.get_latest_package(version=MediumEnum.Latest, - # pkg_type=MediumEnum.RiakCrond, db_type=DBType.Riak) - # riak_monitor_pkg = Package.get_latest_package(version=MediumEnum.Latest, - # pkg_type=MediumEnum.RiakMonitor, db_type=DBType.Riak) + mysql_crond_pkg = Package.get_latest_package(version=MediumEnum.Latest, pkg_type=MediumEnum.MySQLCrond) + riak_monitor_pkg = Package.get_latest_package( + version=MediumEnum.Latest, pkg_type=MediumEnum.RiakMonitor, db_type=DBType.Riak.value + ) return [ f"{env.BKREPO_PROJECT}/{env.BKREPO_BUCKET}/{self.actuator_pkg.path}", f"{env.BKREPO_PROJECT}/{env.BKREPO_BUCKET}/{riak_pkg.path}", - # f"{env.BKREPO_PROJECT}/{env.BKREPO_BUCKET}/{riak_crond_pkg.path}", - # f"{env.BKREPO_PROJECT}/{env.BKREPO_BUCKET}/{riak_monitor_pkg.path}", + f"{env.BKREPO_PROJECT}/{env.BKREPO_BUCKET}/{mysql_crond_pkg.path}", + f"{env.BKREPO_PROJECT}/{env.BKREPO_BUCKET}/{riak_monitor_pkg.path}", ] def redis_cluster_apply_proxy(self, cluster_type) -> list: diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py index 25576cab8d..c7fb7d8022 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py @@ -70,9 +70,9 @@ def deploy_riak_cluster_flow(self): """ riak_pipeline = Builder(root_id=self.root_id, data=self.data) sub_pipeline = SubBuilder(root_id=self.root_id, data=self.data) - # 获取机器资源 done + # 获取机器资源 sub_pipeline.add_act(act_name=_("获取机器信息"), act_component_code=GetRiakResourceComponent.code, kwargs={}) - ips = [ip for ip in self.data["nodes"]] + ips = [node["ip"] for node in self.data["nodes"]] sub_pipeline.add_act( act_name=_("下发actuator以及riak介质"), act_component_code=TransFileComponent.code, @@ -84,6 +84,7 @@ def deploy_riak_cluster_flow(self): ) ), ) + sub_pipeline.add_act( act_name=_("actuator_riak系统配置初始化"), act_component_code=ExecuteRiakActuatorScriptComponent.code, @@ -135,7 +136,6 @@ def deploy_riak_cluster_flow(self): bk_cloud_id=self.data["bk_cloud_id"], run_as_system_user=DBA_ROOT_USER, get_riak_payload_func=RiakActPayload.get_commit_cluster_change_payload.__name__, - cluster=cluster, ) ), ) @@ -149,7 +149,6 @@ def deploy_riak_cluster_flow(self): bk_cloud_id=self.data["bk_cloud_id"], run_as_system_user=DBA_ROOT_USER, get_riak_payload_func=RiakActPayload.get_commit_cluster_change_payload.__name__, - cluster=cluster, ) ), ) @@ -164,6 +163,22 @@ def deploy_riak_cluster_flow(self): ) ), ) + + acts_list = [] + for ip in ips: + monitor_kwargs = RiakActKwargs( + exec_ip=ip, + bk_cloud_id=self.data["bk_cloud_id"], + run_as_system_user=DBA_ROOT_USER, + get_riak_payload_func=RiakActPayload.get_install_monitor_payload.__name__, + ) + act_info = dict() + act_info["act_name"] = (_("actuator_{}部署定时任务和riak监控".format(ip)),) + act_info["act_component_code"] = ExecuteRiakActuatorScriptComponent.code + act_info["kwargs"] = asdict(monitor_kwargs) + acts_list.append(act_info) + sub_pipeline.add_parallel_acts(acts_list=acts_list) + riak_pipeline.add_sub_pipeline(sub_pipeline.build_sub_process(sub_name=_("部署Riak集群"))) riak_pipeline.run_pipeline(init_trans_data_class=ApplyManualContext()) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py index c403d0e427..87b0d11dfe 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py @@ -18,6 +18,7 @@ from backend.flow.consts import DBA_ROOT_USER from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList +from backend.flow.plugins.components.collections.common.pause import PauseComponent from backend.flow.plugins.components.collections.riak.exec_actuator_script import ExecuteRiakActuatorScriptComponent from backend.flow.plugins.components.collections.riak.get_riak_cluster_node import GetRiakClusterNodeComponent from backend.flow.plugins.components.collections.riak.riak_db_meta import RiakDBMetaComponent @@ -53,8 +54,9 @@ def __init__(self, root_id: str, data: Optional[Dict]): def riak_cluster_destroy_flow(self): """ - Riak集群缩容 + Riak集群下架 """ + riak_pipeline = Builder(root_id=self.root_id, data=self.data) sub_pipeline = SubBuilder(root_id=self.root_id, data=self.data) @@ -72,9 +74,6 @@ def riak_cluster_destroy_flow(self): ), ) - # 运维修改配置后才剔除 - # sub_pipeline.add_act(act_name=_("人工确认"), act_component_code=PauseComponent.code, kwargs={}) - sub_pipeline.add_act( act_name=_("actuator_连接检查"), act_component_code=ExecuteRiakActuatorScriptComponent.code, diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py index 64980ebfa0..036bdef24b 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py @@ -85,6 +85,19 @@ def riak_cluster_disable_flow(self): ), ) + sub_pipeline.add_act( + act_name=_("actuator_关闭riak监控"), + act_component_code=ExecuteRiakActuatorScriptComponent.code, + kwargs=asdict( + RiakActKwargs( + get_trans_data_ip_var=NodesContext.get_nodes_var_name(), + bk_cloud_id=self.data["bk_cloud_id"], + run_as_system_user=DBA_ROOT_USER, + get_riak_payload_func=RiakActPayload.get_stop_monitor_payload.__name__, + ) + ), + ) + sub_pipeline.add_act( act_name=_("actuator_关闭riak实例"), act_component_code=ExecuteRiakActuatorScriptComponent.code, diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py index 2089b98d10..1e753c18ae 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py @@ -96,5 +96,18 @@ def riak_cluster_enable_flow(self): ), ) + sub_pipeline.add_act( + act_name=_("actuator_开启riak监控"), + act_component_code=ExecuteRiakActuatorScriptComponent.code, + kwargs=asdict( + RiakActKwargs( + get_trans_data_ip_var=NodesContext.get_nodes_var_name(), + bk_cloud_id=self.data["bk_cloud_id"], + run_as_system_user=DBA_ROOT_USER, + get_riak_payload_func=RiakActPayload.get_start_monitor_payload.__name__, + ) + ), + ) + riak_pipeline.add_sub_pipeline(sub_pipeline.build_sub_process(sub_name=_("Riak集群启用"))) riak_pipeline.run_pipeline(init_trans_data_class=NodesContext()) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py index 9642df6d4a..c31a8c0035 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py @@ -18,6 +18,7 @@ from backend.flow.consts import DBA_ROOT_USER from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList +from backend.flow.plugins.components.collections.common.pause import PauseComponent from backend.flow.plugins.components.collections.riak.exec_actuator_script import ExecuteRiakActuatorScriptComponent from backend.flow.plugins.components.collections.riak.get_riak_cluster_node import GetRiakClusterNodeComponent from backend.flow.plugins.components.collections.riak.get_riak_resource import GetRiakResourceComponent @@ -83,7 +84,7 @@ def riak_cluster_scale_in_flow(self): ) # 运维修改配置后才剔除 - # sub_pipeline.add_act(act_name=_("人工确认"), act_component_code=PauseComponent.code, kwargs={}) + sub_pipeline.add_act(act_name=_("人工确认"), act_component_code=PauseComponent.code, kwargs={}) sub_pipeline.add_act( act_name=_("actuator_连接检查"), @@ -98,6 +99,19 @@ def riak_cluster_scale_in_flow(self): ), ) + sub_pipeline.add_act( + act_name=_("actuator_关闭riak监控"), + act_component_code=ExecuteRiakActuatorScriptComponent.code, + kwargs=asdict( + RiakActKwargs( + get_trans_data_ip_var=ScaleInManualContext.get_operate_nodes_var_name(), + bk_cloud_id=self.data["bk_cloud_id"], + run_as_system_user=DBA_ROOT_USER, + get_riak_payload_func=RiakActPayload.get_stop_monitor_payload.__name__, + ) + ), + ) + sub_pipeline.add_act( act_name=_("actuator_riak集群剔除节点"), act_component_code=ExecuteRiakActuatorScriptComponent.code, diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py index e93851442a..0ec60fdc53 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py @@ -69,6 +69,7 @@ def riak_cluster_scale_out_flow(self): sub_pipeline.add_act(act_name=_("获取机器信息"), act_component_code=GetRiakResourceComponent.code, kwargs={}) sub_pipeline.add_act(act_name=_("获取集群中的节点"), act_component_code=GetRiakClusterNodeComponent.code, kwargs={}) + ips = [node["ip"] for node in self.data["nodes"]] sub_pipeline.add_act( act_name=_("下发actuator以及riak介质"), @@ -172,5 +173,20 @@ def riak_cluster_scale_out_flow(self): ), ) + acts_list = [] + for ip in ips: + monitor_kwargs = RiakActKwargs( + exec_ip=ip, + bk_cloud_id=self.data["bk_cloud_id"], + run_as_system_user=DBA_ROOT_USER, + get_riak_payload_func=RiakActPayload.get_install_monitor_payload.__name__, + ) + act_info = dict() + act_info["act_name"] = (_("actuator_{}部署定时任务和riak监控".format(ip)),) + act_info["act_component_code"] = ExecuteRiakActuatorScriptComponent.code + act_info["kwargs"] = asdict(monitor_kwargs) + acts_list.append(act_info) + sub_pipeline.add_parallel_acts(acts_list=acts_list) + riak_pipeline.add_sub_pipeline(sub_pipeline.build_sub_process(sub_name=_("Riak集群扩容"))) riak_pipeline.run_pipeline(init_trans_data_class=ScaleOutManualContext()) diff --git a/dbm-ui/backend/flow/utils/riak/riak_act_payload.py b/dbm-ui/backend/flow/utils/riak/riak_act_payload.py index 375afc63a7..0a2112df69 100644 --- a/dbm-ui/backend/flow/utils/riak/riak_act_payload.py +++ b/dbm-ui/backend/flow/utils/riak/riak_act_payload.py @@ -1,8 +1,17 @@ +import logging +import os.path + +from backend import env from backend.configuration.constants import DBType +from backend.configuration.models import SystemSettings +from backend.db_meta.enums import MachineType +from backend.db_meta.models import Cluster, Machine, StorageInstance from backend.db_package.models import Package from backend.flow.consts import DBActuatorTypeEnum, MediumEnum, RiakActuatorActionEnum from backend.ticket.constants import TicketType +logger = logging.getLogger("flow") + class RiakActPayload(object): """ @@ -11,7 +20,8 @@ class RiakActPayload(object): def __init__(self, ticket_data: dict, cluster: dict): self.riak_pkg = None - self.bk_biz_id = str(ticket_data["bk_biz_id"]) + self.mysql_crond_pkg = None # riak使用mysql-crond实现定时任务 + self.riak_monitor_pkg = None self.ticket_data = ticket_data self.cluster = cluster @@ -30,7 +40,7 @@ def get_deploy_payload(self, **kwargs) -> dict: 部署节点 """ self.riak_pkg = Package.get_latest_package( - version=self.ticket_data["db_version"], pkg_type=MediumEnum.Riak, db_type=DBType.Riak + version=self.ticket_data["db_version"], pkg_type=MediumEnum.Riak, db_type=DBType.Riak.value ) return { "db_type": DBActuatorTypeEnum.Riak.value, @@ -56,7 +66,7 @@ def get_deploy_trans_payload(self, **kwargs) -> dict: 部署节点 """ self.riak_pkg = Package.get_latest_package( - version=self.ticket_data["db_version"], pkg_type=MediumEnum.Riak, db_type=DBType.Riak + version=self.ticket_data["db_version"], pkg_type=MediumEnum.Riak, db_type=DBType.Riak.value ) configs = kwargs["trans_data"]["configs"] return { @@ -232,3 +242,162 @@ def get_start_payload(self, **kwargs) -> dict: "extend": {}, }, } + + def get_install_monitor_payload(self, **kwargs) -> dict: + """ + 启用 + """ + self.mysql_crond_pkg = Package.get_latest_package(version=MediumEnum.Latest, pkg_type=MediumEnum.MySQLCrond) + self.riak_monitor_pkg = Package.get_latest_package( + version=MediumEnum.Latest, pkg_type=MediumEnum.RiakMonitor, db_type=DBType.Riak.value + ) + machine = Machine.objects.get(ip=kwargs["ip"]) + if machine.machine_type != MachineType.RIAK.value: + logger.error( + "install monitor error. Machine type is {} not {}".format(machine.machine_type, MachineType.RIAK.value) + ) + storage = StorageInstance.objects.filter(machine__ip=kwargs["ip"])[0] + + # 监控自定义上报配置通过SystemSettings表获取 + bkm_dbm_report = SystemSettings.get_setting_value(key="BKM_DBM_REPORT") + # 设置定时任务和调度计划 + schedules = [ + {"name": "riak-err-notice", "expression": "@every 1m"}, + {"name": "riak-load-health", "expression": "@every 1m"}, + {"name": "riak-ring-status", "expression": "@every 10s"}, + {"name": "riak-monitor-hardcode", "expression": "@every 10s"}, + ] + if self.ticket_data["ticket_type"] == TicketType.RIAK_CLUSTER_SCALE_OUT: + cluster = Cluster.objects.get(id=self.ticket_data["cluster_id"]) + domain = cluster.immute_domain + else: + domain = self.ticket_data["domain"] + + return { + "db_type": DBActuatorTypeEnum.Riak.value, + "action": RiakActuatorActionEnum.DeployMonitor.value, + "payload": { + "general": {}, + "extend": { + "crond_pkg": { + "name": self.mysql_crond_pkg.name, + "md5": self.mysql_crond_pkg.md5, + }, + "monitor_pkg": { + "name": self.riak_monitor_pkg.name, + "md5": self.riak_monitor_pkg.md5, + }, + "crond_config": { + "ip": kwargs["ip"], + "bk_cloud_id": self.ticket_data["bk_cloud_id"], + "event_data_id": bkm_dbm_report["event"]["data_id"], + "event_data_token": bkm_dbm_report["event"]["token"], + "metrics_data_id": bkm_dbm_report["metric"]["data_id"], + "metrics_data_token": bkm_dbm_report["metric"]["token"], + "log_path": "logs", + "beat_path": env.MYSQL_CROND_BEAT_PATH, + "agent_address": env.MYSQL_CROND_AGENT_ADDRESS, + }, + "monitor_config": { + "bk_biz_id": int(self.ticket_data["bk_biz_id"]), + "ip": kwargs["ip"], + "port": storage.port, + "bk_instance_id": storage.bk_instance_id, + "immute_domain": domain, + "machine_type": MachineType.RIAK.value, + "bk_cloud_id": self.ticket_data["bk_cloud_id"], + "log_path": "logs", + "items_config_file": "items-config.yaml", + "interact_timeout": 2, + }, + "monitor_items": create_riak_monitor_items(schedules), + "jobs_config": { + "bk_biz_id": int(self.ticket_data["bk_biz_id"]), + "jobs": create_crond_jobs(schedules), + }, + }, + }, + } + + def get_stop_monitor_payload(self, **kwargs) -> dict: + """ + 关闭定时和监控 + """ + return { + "db_type": DBActuatorTypeEnum.Riak.value, + "action": RiakActuatorActionEnum.StopMonitor.value, + "payload": { + "general": {}, + "extend": {}, + }, + } + + def get_start_monitor_payload(self, **kwargs) -> dict: + """ + 启用定时和监控 + """ + return { + "db_type": DBActuatorTypeEnum.Riak.value, + "action": RiakActuatorActionEnum.StartMonitor.value, + "payload": { + "general": {}, + "extend": {}, + }, + } + + +def create_crond_jobs(self: list) -> list: + monitor_path = "/data/monitor/riak-monitor" + jobs = [] + for schedule in self: + cmd = "run" + items = schedule["name"] + if "hardcode" in schedule["name"]: + cmd = "hardcode-run" + items = "db-up,riak_monitor_heart_beat" + job = { + "name": "{}{}".format(schedule["name"], schedule["expression"]), + "enable": True, + "command": os.path.join(monitor_path, "riak-monitor"), + "args": [ + cmd, + "--items", + items, + "-c", + os.path.join(monitor_path, "runtime.yaml"), + ], + "schedule": schedule["expression"], + "creator": "admin", + "work_dir": "", + } + jobs.append(job) + return jobs + + +def create_riak_monitor_items(self: list) -> list: + items = [] + for schedule in self: + if "hardcode" in schedule["name"]: + item = { + "name": "db-up", + "enable": True, + "schedule": schedule["expression"], + "machine_type": [MachineType.RIAK.value], + } + items.append(item) + item = { + "name": "riak_monitor_heart_beat", + "enable": True, + "schedule": schedule["expression"], + "machine_type": [MachineType.RIAK.value], + } + items.append(item) + continue + item = { + "name": schedule["name"], + "enable": True, + "schedule": schedule["expression"], + "machine_type": [MachineType.RIAK.value], + } + items.append(item) + return items