diff --git a/config/config.go b/config/config.go index 69c0c80..20a9eab 100644 --- a/config/config.go +++ b/config/config.go @@ -10,11 +10,11 @@ import ( ) const ( - ReleemAgentVersion = "1.16.0" + ReleemAgentVersion = "1.17.0" ) var ( - db *sql.DB + DB *sql.DB ) type Config struct { diff --git a/current_version_agent b/current_version_agent index 71bd5d9..73d7467 100644 --- a/current_version_agent +++ b/current_version_agent @@ -1 +1 @@ -1.16.0 \ No newline at end of file +1.17.0 \ No newline at end of file diff --git a/go.mod b/go.mod index 2b1bc54..abf3f74 100644 --- a/go.mod +++ b/go.mod @@ -1,36 +1,37 @@ module github.com/Releem/mysqlconfigurer -go 1.19 +go 1.22.0 require ( github.com/Releem/daemon v0.0.0-20221103142627-2a82cf09ac69 github.com/advantageous/go-logback v0.0.0-20161215180304-6db19679ca3e - github.com/aws/aws-sdk-go v1.49.2 - github.com/aws/aws-sdk-go-v2 v1.24.0 - github.com/aws/aws-sdk-go-v2/config v1.26.1 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.30.0 - github.com/aws/aws-sdk-go-v2/service/ec2 v1.141.0 - github.com/aws/aws-sdk-go-v2/service/rds v1.64.5 - github.com/go-sql-driver/mysql v1.7.1 + github.com/aws/aws-sdk-go v1.53.7 + github.com/aws/aws-sdk-go-v2 v1.27.0 + github.com/aws/aws-sdk-go-v2/config v1.27.15 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.38.3 + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.35.4 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.161.3 + github.com/aws/aws-sdk-go-v2/service/rds v1.79.1 + github.com/go-sql-driver/mysql v1.8.1 github.com/hashicorp/hcl v1.0.0 github.com/pkg/errors v0.9.1 - github.com/shirou/gopsutil/v3 v3.23.11 + github.com/shirou/gopsutil/v3 v3.24.4 ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 // indirect - github.com/aws/smithy-go v1.19.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.15 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.9 // indirect + github.com/aws/smithy-go v1.20.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect @@ -38,6 +39,6 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/sys v0.15.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + golang.org/x/sys v0.19.0 // indirect ) diff --git a/go.sum b/go.sum index 30d87c7..d0a10fb 100644 --- a/go.sum +++ b/go.sum @@ -1,52 +1,54 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/Releem/daemon v0.0.0-20221103142627-2a82cf09ac69 h1:XThKJbiC8V5YzQRrTRvFITODw+H6ZiSA36UU7ZzUF1A= github.com/Releem/daemon v0.0.0-20221103142627-2a82cf09ac69/go.mod h1:GxsvZP6BRrh+rSHnXaXzuShSiiiMEfDxuutowpgCG8w= github.com/advantageous/go-logback v0.0.0-20161215180304-6db19679ca3e h1:zDwXL5E118a4JRyWUVVzGUg4zDXY2CfllYYu+B6Vgy8= github.com/advantageous/go-logback v0.0.0-20161215180304-6db19679ca3e/go.mod h1:pynxONZJ8msfhJ8u3t9OQZVPsn9i9AW4VW55zv9K9+I= -github.com/aws/aws-sdk-go v1.49.2 h1:+4BEcm1nPCoDbVd+gg8cdxpa1qJfrvnddy12vpEVWjw= -github.com/aws/aws-sdk-go v1.49.2/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= -github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= -github.com/aws/aws-sdk-go-v2/config v1.26.1 h1:z6DqMxclFGL3Zfo+4Q0rLnAZ6yVkzCRxhRMsiRQnD1o= -github.com/aws/aws-sdk-go-v2/config v1.26.1/go.mod h1:ZB+CuKHRbb5v5F0oJtGdhFTelmrxd4iWO1lf0rQwSAg= -github.com/aws/aws-sdk-go-v2/credentials v1.16.12 h1:v/WgB8NxprNvr5inKIiVVrXPuuTegM+K8nncFkr1usU= -github.com/aws/aws-sdk-go-v2/credentials v1.16.12/go.mod h1:X21k0FjEJe+/pauud82HYiQbEr9jRKY3kXEIQ4hXeTQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 h1:v+HbZaCGmOwnTTVS86Fleq0vPzOd7tnJGbFhP0stNLs= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VDLBtCMkQYOw1QYfAEZCVLrfI0ezve8wd4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrwK1SKFIJrA9pOJ5yu2eSHnmls= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 h1:f426fLs4hcrLuczLBqWf1Ob6FKJhISaR4e9Iw3Scr5A= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.30.0 h1:CMZz/TJgt+GMKRxjuedxhMFs45GPhyst/a/7Q3DuAg4= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.30.0/go.mod h1:4Oeb7n2r/ApBIHphQkprve380p/RpPWBotumd44EDGg= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.141.0 h1:cP43vFYAQyREOp972C+6d4+dzpxo3HolNvWfeBvr2Yg= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.141.0/go.mod h1:qjhtI9zjpUHRc6khtrIM9fb48+ii6+UikL3/b+MKYn0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9/go.mod h1:idky4TER38YIjr2cADF1/ugFMKvZV7p//pVeV5LZbF0= -github.com/aws/aws-sdk-go-v2/service/rds v1.64.5 h1:HzkVXbafwf/N+uwNzuXaOpXwG2z8mi7nYFRKHeH/hFQ= -github.com/aws/aws-sdk-go-v2/service/rds v1.64.5/go.mod h1:MYzRMSdY70kcS8AFg0aHmk/xj6VAe0UfaCCoLrBWPow= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 h1:ldSFWz9tEHAwHNmjx2Cvy1MjP5/L9kNoR0skc6wyOOM= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.5/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 h1:2k9KmFawS63euAkY4/ixVNsYYwrwnd5fIvgEKkfZFNM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 h1:5UYvv8JUvllZsRnfrcMQ+hJ9jNICmcgKPAO1CER25Wg= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.5/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= -github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= -github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/aws-sdk-go v1.53.7 h1:ZSsRYHLRxsbO2rJR2oPMz0SUkJLnBkN+1meT95B6Ixs= +github.com/aws/aws-sdk-go v1.53.7/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= +github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/config v1.27.15 h1:uNnGLZ+DutuNEkuPh6fwqK7LpEiPmzb7MIMA1mNWEUc= +github.com/aws/aws-sdk-go-v2/config v1.27.15/go.mod h1:7j7Kxx9/7kTmL7z4LlhwQe63MYEE5vkVV6nWg4ZAI8M= +github.com/aws/aws-sdk-go-v2/credentials v1.17.15 h1:YDexlvDRCA8ems2T5IP1xkMtOZ1uLJOCJdTr0igs5zo= +github.com/aws/aws-sdk-go-v2/credentials v1.17.15/go.mod h1:vxHggqW6hFNaeNC0WyXS3VdyjcV0a4KMUY4dKJ96buU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.38.3 h1:pGlGfpL+Su4SFonqREs/0u+Uq0iYv+FMhg2NmFHGBYo= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.38.3/go.mod h1:ECX6i01ws5YQ8L58dwwoexhCmDR6hAV/sv+Q8IQ+jj4= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.35.4 h1:QSIpvF/tE8Uoy+RNkbMpTahLZHLA1c6vi9tbSE7PZUY= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.35.4/go.mod h1:OfO65DNsDX+wgWmjljN55I+Dzo4nbhWNlNFuco5AAgw= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.161.3 h1:l0mvKOGm25yo/Fy+Y/08Cm4aTA4XmnIuq4ppy+shfMI= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.161.3/go.mod h1:iJ2sQeUTkjNp3nL7kE/Bav0xXYhtiRCRP5ZXk4jFhCQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= +github.com/aws/aws-sdk-go-v2/service/rds v1.79.1 h1:OzwXMImfUSYfmAxtZB1LC0ZM5PayF7llq3I7SSPDxcY= +github.com/aws/aws-sdk-go-v2/service/rds v1.79.1/go.mod h1:/SU1vNf8MsUyfRkEkv3Hcz9y5uSTyBS+ohATQOj6ioQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 h1:Kv1hwNG6jHC/sxMTe5saMjH6t6ZLkgfvVxyEjfWL1ks= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.8/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 h1:nWBZ1xHCF+A7vv9sDzJOq4NWIdzFYm0kH7Pr4OjHYsQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.9 h1:Qp6Boy0cGDloOE3zI6XhNLNZgjNS8YmiFQFHe71SaW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.9/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= 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/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -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/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -65,8 +67,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= -github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= +github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -74,22 +76,24 @@ github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnj 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/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/install.sh b/install.sh index 3d97dd0..5b00a3f 100644 --- a/install.sh +++ b/install.sh @@ -1,5 +1,5 @@ #!/bin/bash -# install.sh - Version 1.16.0 +# install.sh - Version 1.17.0 # (C) Releem, Inc 2022 # All rights reserved @@ -7,7 +7,7 @@ # using the package manager. set -e -install_script_version=1.16.0 +install_script_version=1.17.0 logfile="releem-install.log" WORKDIR="/opt/releem" diff --git a/main.go b/main.go index 3a473a2..e003632 100644 --- a/main.go +++ b/main.go @@ -12,7 +12,6 @@ import ( "github.com/Releem/mysqlconfigurer/config" m "github.com/Releem/mysqlconfigurer/metrics" r "github.com/Releem/mysqlconfigurer/repeater" - t "github.com/Releem/mysqlconfigurer/tasks" "github.com/advantageous/go-logback/logging" awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs" @@ -189,16 +188,18 @@ func (service *Service) Manage(logger logging.Logger, configFile string, command logger.Println("Connect Success to DB via tcp", configuration.MysqlHost) } } + config.DB = db defer db.Close() //Init repeaters repeaters := make(map[string]m.MetricsRepeater) - repeaters["Metrics"] = m.MetricsRepeater(r.NewReleemMetricsRepeater(configuration)) + repeaters["Metrics"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, m.Mode{Name: "Metrics", ModeType: ""})) repeaters["Configurations"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, Mode)) - repeaters["Event"] = m.MetricsRepeater(r.NewReleemEventRepeater(configuration, Mode)) - repeaters["TaskGet"] = m.MetricsRepeater(t.NewReleemTaskGetRepeater(configuration)) - repeaters["TaskStatus"] = m.MetricsRepeater(t.NewReleemTaskStatusRepeater(configuration)) - repeaters["TaskSet"] = m.MetricsRepeater(t.NewReleemTaskSetRepeater(configuration, Mode)) + repeaters["Event"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, Mode)) + repeaters["TaskGet"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, m.Mode{Name: "TaskGet", ModeType: ""})) + repeaters["TaskStatus"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, m.Mode{Name: "TaskStatus", ModeType: ""})) + repeaters["TaskSet"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, Mode)) + repeaters["GetConfigurationJson"] = m.MetricsRepeater(r.NewReleemConfigurationsRepeater(configuration, m.Mode{Name: "Configurations", ModeType: "get-json"})) //Init gatherers gatherers = append(gatherers, diff --git a/metrics/dbCollectQueries.go b/metrics/dbCollectQueries.go index ac1c545..4cf2aad 100644 --- a/metrics/dbCollectQueries.go +++ b/metrics/dbCollectQueries.go @@ -37,13 +37,13 @@ func (DbCollectQueries *DbCollectQueries) GetMetrics(metrics *Metrics) error { var schema_name, query, query_text string var calls, avg_time_us, sum_time_us int - rows, err := DbCollectQueries.db.Query("SELECT IFNULL(schema_name, 'NULL') as schema_name, IFNULL(digest_text, 'NULL') as query, IFNULL(QUERY_SAMPLE_TEXT, 'NULL') as query_text, count_star as calls, round(avg_timer_wait/1000000, 0) as avg_time_us, round(SUM_TIMER_WAIT/1000000, 0) as sum_time_us FROM performance_schema.events_statements_summary_by_digest") + rows, err := DbCollectQueries.db.Query("SELECT IFNULL(schema_name, 'NULL') as schema_name, IFNULL(digest, 'NULL') as query_id, IFNULL(digest_text, 'NULL') as query, IFNULL(QUERY_SAMPLE_TEXT, 'NULL') as query_text, count_star as calls, round(avg_timer_wait/1000000, 0) as avg_time_us, round(SUM_TIMER_WAIT/1000000, 0) as sum_time_us FROM performance_schema.events_statements_summary_by_digest") if err != nil { if err != sql.ErrNoRows { DbCollectQueries.logger.Error(err) } - rows, err = DbCollectQueries.db.Query("SELECT IFNULL(schema_name, 'NULL') as schema_name, IFNULL(digest_text, 'NULL') as query, count_star as calls, round(avg_timer_wait/1000000, 0) as avg_time_us, round(SUM_TIMER_WAIT/1000000, 0) as sum_time_us FROM performance_schema.events_statements_summary_by_digest") + rows, err = DbCollectQueries.db.Query("SELECT IFNULL(schema_name, 'NULL') as schema_name, IFNULL(digest, 'NULL') as query_id, IFNULL(digest_text, 'NULL') as query, count_star as calls, round(avg_timer_wait/1000000, 0) as avg_time_us, round(SUM_TIMER_WAIT/1000000, 0) as sum_time_us FROM performance_schema.events_statements_summary_by_digest") if err != nil { if err != sql.ErrNoRows { DbCollectQueries.logger.Error(err) diff --git a/metrics/runner.go b/metrics/runner.go index 3e9e567..b7c6093 100644 --- a/metrics/runner.go +++ b/metrics/runner.go @@ -2,9 +2,11 @@ package metrics import ( "bytes" + "encoding/json" "os" "os/exec" "os/signal" + "strings" "syscall" "time" @@ -60,7 +62,7 @@ func RunWorker(gatherers []MetricsGatherer, gatherers_configuration []MetricsGat task := processRepeaters(metrics, repeaters["Metrics"], configuration, logger) if task == "Task" { logger.Println(" * A task has been found for the agent...") - f := processTaskFunc(metrics, repeaters, logger, configuration) + f := processTaskFunc(metrics, repeaters, gatherers, logger, configuration) time.AfterFunc(5*time.Second, f) } } @@ -73,7 +75,13 @@ func RunWorker(gatherers []MetricsGatherer, gatherers_configuration []MetricsGat logger.Println(" * Collecting metrics to recommend a config...") metrics := collectMetrics(append(gatherers, gatherers_configuration...), logger) if Ready { + logger.Println(" * Sending metrics to Releem Cloud Platform...") processRepeaters(metrics, repeaters[Mode.Name], configuration, logger) + if Mode.Name == "Configurations" { + logger.Println("1. Recommended MySQL configuration downloaded to ", configuration.GetReleemConfDir()) + logger.Println("2. To check MySQL Performance Score please visit https://app.releem.com/dashboard?menu=metrics") + logger.Println("3. To apply the recommended configuration please read documentation https://app.releem.com/dashboard") + } } if (Mode.Name == "Configurations" && Mode.ModeType != "default") || Mode.Name == "Event" || Mode.Name == "TaskSet" { os.Exit(0) @@ -83,158 +91,203 @@ func RunWorker(gatherers []MetricsGatherer, gatherers_configuration []MetricsGat } } -func processTaskFunc(metrics Metrics, repeaters map[string]MetricsRepeater, logger logging.Logger, configuration *config.Config) func() { +func processTaskFunc(metrics Metrics, repeaters map[string]MetricsRepeater, gatherers []MetricsGatherer, logger logging.Logger, configuration *config.Config) func() { return func() { - processTask(metrics, repeaters, logger, configuration) + processTask(metrics, repeaters, gatherers, logger, configuration) } } -func processTask(metrics Metrics, repeaters map[string]MetricsRepeater, logger logging.Logger, configuration *config.Config) { +func processTask(metrics Metrics, repeaters map[string]MetricsRepeater, gatherers []MetricsGatherer, logger logging.Logger, configuration *config.Config) { defer HandlePanic(configuration, logger) output := make(MetricGroupValue) //metrics := collectMetrics(gatherers, logger) + var task_output string task := processRepeaters(metrics, repeaters["TaskGet"], configuration, logger) - if task.(Task).TaskTypeID != nil { - TaskTypeID := *task.(Task).TaskTypeID - TaskID := *task.(Task).TaskID - var stdout, stderr bytes.Buffer + if task.(Task).TaskTypeID == nil { + return + } + + TaskTypeID := *task.(Task).TaskTypeID + TaskID := *task.(Task).TaskID + var stdout, stderr bytes.Buffer + + output["task_id"] = TaskID + output["task_type_id"] = TaskTypeID + output["task_status"] = 3 + output["task_output"] = "" + + metrics.ReleemAgent.Tasks = output + processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) + logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "is being started...") + + if TaskTypeID == 0 { + output["task_exit_code"], output["task_status"], task_output = execCmd(configuration.ReleemDir+"/mysqlconfigurer.sh -a", []string{"RELEEM_RESTART_SERVICE=1"}, logger) + output["task_output"] = output["task_output"].(string) + task_output - output["task_id"] = TaskID - output["task_type_id"] = TaskTypeID - output["task_status"] = 3 - metrics.ReleemAgent.Tasks = output - logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "is being started...") - if TaskTypeID == 0 { - cmd := exec.Command(configuration.ReleemDir+"/mysqlconfigurer.sh", "-a") + if output["task_exit_code"] == 7 { + var rollback_exit_code int + cmd := exec.Command(configuration.ReleemDir+"/mysqlconfigurer.sh", "-r") cmd.Stdout = &stdout cmd.Stderr = &stderr cmd.Env = append(cmd.Environ(), "RELEEM_RESTART_SERVICE=1") - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) err := cmd.Run() - task_output := "" if err != nil { - task_output = task_output + err.Error() + output["task_output"] = output["task_output"].(string) + err.Error() logger.Error(err) if exiterr, ok := err.(*exec.ExitError); ok { - output["task_exit_code"] = exiterr.ExitCode() + rollback_exit_code = exiterr.ExitCode() } else { - output["task_exit_code"] = 999 + rollback_exit_code = 999 } - output["task_status"] = 4 } else { - output["task_exit_code"] = 0 - output["task_status"] = 1 + rollback_exit_code = 0 } - output["task_output"] = task_output + stdout.String() + stderr.String() + output["task_output"] = output["task_output"].(string) + stdout.String() + stderr.String() + logger.Println(" * Task rollbacked with code", rollback_exit_code) + } - if output["task_exit_code"] == 7 { - var rollback_exit_code int - cmd := exec.Command(configuration.ReleemDir+"/mysqlconfigurer.sh", "-r") - cmd.Stdout = &stdout - cmd.Stderr = &stderr - cmd.Env = append(cmd.Environ(), "RELEEM_RESTART_SERVICE=1") - err := cmd.Run() - if err != nil { - task_output = task_output + err.Error() - logger.Error(err) - if exiterr, ok := err.(*exec.ExitError); ok { - rollback_exit_code = exiterr.ExitCode() - } else { - rollback_exit_code = 999 - } - } else { - rollback_exit_code = 0 - } - output["task_output"] = task_output + stdout.String() + stderr.String() - logger.Println(" * Task rollbacked with code", rollback_exit_code) - } - logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "completed with code", output["task_exit_code"]) + } else if TaskTypeID == 1 { + output["task_exit_code"], output["task_status"], task_output = execCmd(configuration.ReleemDir+"/releem-agent -f", []string{}, logger) + output["task_output"] = output["task_output"].(string) + task_output + } else if TaskTypeID == 2 { + output["task_exit_code"], output["task_status"], task_output = execCmd(configuration.ReleemDir+"/mysqlconfigurer.sh -u", []string{}, logger) + output["task_output"] = output["task_output"].(string) + task_output + } else if TaskTypeID == 3 { + output["task_exit_code"], output["task_status"], task_output = execCmd(configuration.ReleemDir+"/releem-agent --task=collect_queries", []string{}, logger) + output["task_output"] = output["task_output"].(string) + task_output + } else if TaskTypeID == 4 { + if configuration.InstanceType != "aws" { + output["task_exit_code"], output["task_status"], task_output = execCmd(configuration.ReleemDir+"/mysqlconfigurer.sh -s automatic", []string{"RELEEM_RESTART_SERVICE=0"}, logger) + output["task_output"] = output["task_output"].(string) + task_output + } + if output["task_exit_code"] == 0 { + result_data := MetricGroupValue{} + // flush_queries := []string{"flush status", "flush statistic"} + need_restart := false + need_privileges := false + need_flush := false + error_exist := false - metrics.ReleemAgent.Tasks = output - logger.Debug(output) - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) - } else if TaskTypeID == 1 { - cmd := exec.Command(configuration.ReleemDir+"/releem-agent", "-f") - cmd.Stdout = &stdout - cmd.Stderr = &stderr - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) - err := cmd.Run() - task_output := "" + recommend_var := processRepeaters(metrics, repeaters["GetConfigurationJson"], configuration, logger) + err := json.Unmarshal([]byte(recommend_var.(string)), &result_data) if err != nil { - task_output = task_output + err.Error() logger.Error(err) - if exiterr, ok := err.(*exec.ExitError); ok { - output["task_exit_code"] = exiterr.ExitCode() - } else { - output["task_exit_code"] = 999 - } - output["task_status"] = 4 - } else { - output["task_exit_code"] = 0 - output["task_status"] = 1 } - output["task_output"] = task_output + stderr.String() - logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "completed with code", output["task_exit_code"]) - metrics.ReleemAgent.Tasks = output - logger.Debug(output) - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) - } else if TaskTypeID == 2 { - cmd := exec.Command(configuration.ReleemDir+"/mysqlconfigurer.sh", "-u") - cmd.Stdout = &stdout - cmd.Stderr = &stderr - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) - err := cmd.Run() - task_output := "" - if err != nil { - task_output = task_output + err.Error() - logger.Error(err) - if exiterr, ok := err.(*exec.ExitError); ok { - output["task_exit_code"] = exiterr.ExitCode() - } else { - output["task_exit_code"] = 999 + for key := range result_data { + logger.Println(key, result_data[key], metrics.DB.Conf.Variables[key]) + + if result_data[key] != metrics.DB.Conf.Variables[key] { + query_set_var := "set global " + key + "=" + result_data[key].(string) + _, err := config.DB.Exec(query_set_var) + if err != nil { + logger.Error(err) + output["task_output"] = output["task_output"].(string) + err.Error() + if strings.Contains(err.Error(), "is a read only variable") { + need_restart = true + } else if strings.Contains(err.Error(), "Access denied") { + need_privileges = true + break + } else { + error_exist = true + break + } + } else { + need_flush = true + } } + } + logger.Println(need_flush, need_restart, need_privileges, error_exist) + if error_exist { + output["task_exit_code"] = 8 output["task_status"] = 4 } else { - output["task_exit_code"] = 0 - output["task_status"] = 1 + // if need_flush { + // for _, query := range flush_queries { + // _, err := config.DB.Exec(query) + // if err != nil { + // output["task_output"] = output["task_output"].(string) + err.Error() + // logger.Error(err) + // // if exiterr, ok := err.(*exec.ExitError); ok { + // // output["task_exit_code"] = exiterr.ExitCode() + // // } else { + // // output["task_exit_code"] = 999 + // // } + // } + // // } else { + // // output["task_exit_code"] = 0 + // // } + // } + // } + if need_privileges { + output["task_exit_code"] = 9 + output["task_status"] = 4 + } else if need_restart { + output["task_exit_code"] = 10 + } } - output["task_output"] = task_output + stderr.String() - logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "completed with code", output["task_exit_code"]) + metrics = collectMetrics(gatherers, logger) + } + } else if TaskTypeID == 5 { + output["task_exit_code"], output["task_status"], task_output = execCmd(configuration.ReleemDir+"/mysqlconfigurer.sh -s automatic", []string{"RELEEM_RESTART_SERVICE=1"}, logger) + output["task_output"] = output["task_output"].(string) + task_output - metrics.ReleemAgent.Tasks = output - logger.Debug(output) - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) - } else if TaskTypeID == 3 { - cmd := exec.Command(configuration.ReleemDir+"/releem-agent", "--task=collect_queries") + if output["task_exit_code"] == 7 { + var rollback_exit_code int + cmd := exec.Command(configuration.ReleemDir+"/mysqlconfigurer.sh", "-r") cmd.Stdout = &stdout cmd.Stderr = &stderr - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) + cmd.Env = append(cmd.Environ(), "RELEEM_RESTART_SERVICE=1") err := cmd.Run() - task_output := "" if err != nil { - task_output = task_output + err.Error() + output["task_output"] = output["task_output"].(string) + err.Error() logger.Error(err) if exiterr, ok := err.(*exec.ExitError); ok { - output["task_exit_code"] = exiterr.ExitCode() + rollback_exit_code = exiterr.ExitCode() } else { - output["task_exit_code"] = 999 + rollback_exit_code = 999 } - output["task_status"] = 4 } else { - output["task_exit_code"] = 0 - output["task_status"] = 1 + rollback_exit_code = 0 } - output["task_output"] = task_output + stderr.String() - logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "completed with code", output["task_exit_code"]) - - metrics.ReleemAgent.Tasks = output - logger.Debug(output) - processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) + output["task_output"] = output["task_output"].(string) + stdout.String() + stderr.String() + logger.Println(" * Task rollbacked with code", rollback_exit_code) } } + logger.Debug(output) + logger.Println(" * Task with id -", TaskID, "and type id -", TaskTypeID, "completed with code", output["task_exit_code"]) + metrics.ReleemAgent.Tasks = output + processRepeaters(metrics, repeaters["TaskStatus"], configuration, logger) + } +func execCmd(cmd_path string, environment []string, logger logging.Logger) (int, int, string) { + var stdout, stderr bytes.Buffer + var task_exit_code, task_status int + cmd := exec.Command("sh", "-c", cmd_path) + cmd.Stdout = &stdout + cmd.Stderr = &stderr + for _, env := range environment { + cmd.Env = append(cmd.Environ(), env) + } + err := cmd.Run() + task_output := "" + if err != nil { + task_output = task_output + err.Error() + logger.Error(err) + if exiterr, ok := err.(*exec.ExitError); ok { + task_exit_code = exiterr.ExitCode() + } else { + task_exit_code = 999 + } + task_status = 4 + } else { + task_exit_code = 0 + task_status = 1 + } + task_output = task_output + stdout.String() + stderr.String() + return task_exit_code, task_status, task_output +} func processRepeaters(metrics Metrics, repeaters MetricsRepeater, configuration *config.Config, logger logging.Logger) interface{} { defer HandlePanic(configuration, logger) diff --git a/mysqlconfigurer.sh b/mysqlconfigurer.sh index 59ccb63..d6247d7 100755 --- a/mysqlconfigurer.sh +++ b/mysqlconfigurer.sh @@ -1,5 +1,5 @@ #!/bin/bash -# mysqlconfigurer.sh - Version 1.16.0 +# mysqlconfigurer.sh - Version 1.17.0 # (C) Releem, Inc 2022 # All rights reserved @@ -12,7 +12,7 @@ MYSQLTUNER_REPORT=$MYSQLCONFIGURER_PATH"mysqltunerreport.json" RELEEM_MYSQL_VERSION=$MYSQLCONFIGURER_PATH"mysql_version" MYSQLCONFIGURER_CONFIGFILE="${MYSQLCONFIGURER_PATH}${MYSQLCONFIGURER_FILE_NAME}" MYSQL_MEMORY_LIMIT=0 -VERSION="1.16.0" +VERSION="1.17.0" RELEEM_INSTALL_PATH=$MYSQLCONFIGURER_PATH"install.sh" logfile="releem-mysqlconfigurer.log" @@ -37,7 +37,7 @@ function update_agent() { /opt/releem/releem-agent start > /dev/null || true NEW_VER=$(curl -s -L https://releem.s3.amazonaws.com/v2/current_version_agent) if [ "$NEW_VER" != "$VERSION" ]; then - if [ "$(printf '%s\n' "$NEW_VER" "$VERSION" | sort -V | head -n1)" = "$VERSION" ]; + if [ "$(printf '%s\n' "$NEW_VER" "$VERSION" | sort -V | head -n1)" = "$VERSION" ]; then printf "\033[37m\n * Updating script \e[31;1m%s\e[0m -> \e[32;1m%s\e[0m\n" "$VERSION" "$NEW_VER" curl -s -L https://releem.s3.amazonaws.com/v2/install.sh > "$RELEEM_INSTALL_PATH" @@ -248,9 +248,12 @@ function releem_ps_mysql() { function releem_apply_config() { - if [ "$1" == "auto" ]; + if [ "$1" == "auto" ]; then releem_apply_auto + elif [ "$1" == "automatic" ]; + then + releem_apply_automatic else releem_apply_manual fi @@ -292,7 +295,7 @@ function releem_apply_manual() { retVal=$? if [ $retVal -eq 0 ]; then - printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m The new configuration does not differ from the current one applied. No restart is required.!\033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m The new configuration does not differ from the current one applied. No restart is required.!\033[0m\n" exit 0 fi fi @@ -351,6 +354,86 @@ function releem_apply_manual() { exit "${RESTART_CODE}" } +function releem_apply_automatic() { + printf "\n`date +%Y%m%d-%H:%M:%S`\033[37m Applying the recommended MySQL configuration...\033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[37m Getting the latest up-to-date configuration...\033[0m\n" + /opt/releem/releem-agent -c >/dev/null 2>&1 || true + + if [ ! -f $MYSQLCONFIGURER_CONFIGFILE ]; then + printf "\033[37m\n * Recommended MySQL configuration is not found.\033[0m" + printf "\033[37m\n * Please apply recommended configuration later or run Releem Agent manually:\033[0m" + printf "\033[32m\n /opt/releem/releem-agent -f \033[0m\n\n" + exit 1; + fi + if ! check_mysql_version; then + printf "\033[31m\n * MySQL version is lower than 5.6.7. Check the documentation https://github.com/Releem/mysqlconfigurer#how-to-apply-the-recommended-configuration for applying the configuration. \033[0m\n" + exit 2 + fi + if [ -z "$RELEEM_MYSQL_CONFIG_DIR" -o ! -d "$RELEEM_MYSQL_CONFIG_DIR" ]; then + printf "\033[37m\n * MySQL configuration directory is not found.\033[0m" + printf "\033[37m\n * Try to reinstall Releem Agent, and please set the my.cnf location.\033[0m" + exit 3; + fi + if [ -z "$RELEEM_MYSQL_RESTART_SERVICE" ]; then + printf "\033[37m\n * The command to restart the MySQL service was not found. Try to reinstall Releem Agent.\033[0m" + exit 4; + fi + + FLAG_RESTART_SERVICE=1 + if [ -z "$RELEEM_RESTART_SERVICE" ]; then + read -p "Please confirm the MySQL service restart? (Y/N) " -n 1 -r + echo # move to a new line + if [[ ! $REPLY =~ ^[Yy]$ ]] + then + printf "\n`date +%Y%m%d-%H:%M:%S`\033[37m A confirmation to restart the service has not been received. Releem recommended configuration has not been applied.\033[0m\n" + FLAG_RESTART_SERVICE=0 + fi + elif [ "$RELEEM_RESTART_SERVICE" -eq 0 ]; then + FLAG_RESTART_SERVICE=0 + fi + + + printf "\n`date +%Y%m%d-%H:%M:%S`\033[37m Copying file $MYSQLCONFIGURER_CONFIGFILE to directory $RELEEM_MYSQL_CONFIG_DIR/...\033[0m\n" + if [ ! -f "${MYSQLCONFIGURER_PATH}${MYSQLCONFIGURER_FILE_NAME}.bkp" ]; then + yes | cp -f "${RELEEM_MYSQL_CONFIG_DIR}/${MYSQLCONFIGURER_FILE_NAME}" "${MYSQLCONFIGURER_PATH}${MYSQLCONFIGURER_FILE_NAME}.bkp" + fi + yes | cp -fr $MYSQLCONFIGURER_CONFIGFILE $RELEEM_MYSQL_CONFIG_DIR/ + chmod 644 $RELEEM_MYSQL_CONFIG_DIR/* + + if [ "$FLAG_RESTART_SERVICE" -ne 0 ]; then + #echo "-------Test config-------" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[37m Restarting MySQL with the command '$RELEEM_MYSQL_RESTART_SERVICE'...\033[0m\n" + eval "$RELEEM_MYSQL_RESTART_SERVICE" & + wait_restart $! + RESTART_CODE=$? + + if [ $RESTART_CODE -eq 0 ]; + then + printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m The MySQL service restarted successfully!\033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m Recommended configuration applied successfully!\033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S` Releem Score and Unapplied recommendations in the Releem Dashboard will be updated in a few minutes.\n" + rm -f "${MYSQLCONFIGURER_PATH}${MYSQLCONFIGURER_FILE_NAME}.bkp" + elif [ $RESTART_CODE -eq 6 ]; + then + printf "\n`date +%Y%m%d-%H:%M:%S`\033[31m MySQL service failed to restart in 1200 seconds! \033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[31m Wait for the MySQL service to start and Check the MySQL error log!\033[0m\n" + + printf "\n`date +%Y%m%d-%H:%M:%S`\033[31m Try to roll back the configuration application using the command: \033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m bash /opt/releem/mysqlconfigurer.sh -r\033[0m\n\n" + elif [ $RESTART_CODE -eq 7 ]; + then + printf "\n`date +%Y%m%d-%H:%M:%S`\033[31m MySQL service failed to restart! Check the MySQL error log! \033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[31m Try to roll back the configuration application using the command: \033[0m\n" + printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m bash /opt/releem/mysqlconfigurer.sh -r\033[0m\n\n" + fi + else + RESTART_CODE=0 + fi + /opt/releem/releem-agent --event=config_applied > /dev/null + printf "\n`date +%Y%m%d-%H:%M:%S`\033[32m Notification to Releem Platform was sent successfully!\033[0m\n" + + exit "${RESTART_CODE}" +} function releem_runnig_cron() { HOUR=$(date +%I) @@ -517,7 +600,7 @@ if test -f $RELEEM_CONF_FILE ; then if [ ! -z "$mysql_port" ]; then connection_string="${connection_string} --port=$mysql_port" else - connection_string="${connection_string} --port=3306" + connection_string="${connection_string} --port=3306" fi fi diff --git a/repeater/releemConfiguration.go b/repeater/releemConfiguration.go index 9c79fa2..423e0c3 100644 --- a/repeater/releemConfiguration.go +++ b/repeater/releemConfiguration.go @@ -22,36 +22,61 @@ type ReleemConfigurationsRepeater struct { } func (repeater ReleemConfigurationsRepeater) ProcessMetrics(context m.MetricContext, metrics m.Metrics) (interface{}, error) { - repeater.logger.Println(" * Sending metrics to Releem Cloud Platform...") + repeater.logger.Debug(repeater.Mode.Name, repeater.Mode.ModeType) e, _ := json.Marshal(metrics) bodyReader := strings.NewReader(string(e)) repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain string + var api_domain, subdomain string env := context.GetEnv() + if env == "dev2" { - api_domain = "https://api.dev2.releem.com/v2/" + subdomain = "dev2." } else if env == "dev" { - api_domain = "https://api.dev.releem.com/v2/" + subdomain = "dev." } else if env == "stage" { - api_domain = "https://api.stage.releem.com/v2/" + subdomain = "stage." } else { - api_domain = "https://api.releem.com/v2/" + subdomain = "" } - if repeater.Mode.ModeType == "set" { - api_domain = api_domain + "mysql" - } else if repeater.Mode.ModeType == "get" { - api_domain = api_domain + "config" + + if repeater.Mode.Name == "TaskSet" && repeater.Mode.ModeType == "collect_queries" { + api_domain = "https://api.queries." + subdomain + "releem.com/v2/" } else { - api_domain = api_domain + "mysql" + api_domain = "https://api." + subdomain + "releem.com/v2/" + } + + if repeater.Mode.Name == "Configurations" { + if repeater.Mode.ModeType == "set" { + api_domain = api_domain + "mysql" + } else if repeater.Mode.ModeType == "get" { + api_domain = api_domain + "config" + } else if repeater.Mode.ModeType == "get-json" { + api_domain = api_domain + "config?json=1" + } else { + api_domain = api_domain + "mysql" + } + } else if repeater.Mode.Name == "Metrics" { + api_domain = api_domain + "metrics" + } else if repeater.Mode.Name == "Event" { + api_domain = api_domain + "event/" + repeater.Mode.ModeType + } else if repeater.Mode.Name == "TaskGet" { + api_domain = api_domain + "task/task_get" + } else if repeater.Mode.Name == "TaskSet" { + api_domain = api_domain + "task/" + repeater.Mode.ModeType + } else if repeater.Mode.Name == "TaskStatus" { + api_domain = api_domain + "task/task_status" } + repeater.logger.Debug(api_domain) + req, err := http.NewRequest(http.MethodPost, api_domain, bodyReader) if err != nil { repeater.logger.Error("Request: could not create request: ", err) return nil, err } req.Header.Set("x-releem-api-key", context.GetApiKey()) + client := http.Client{ - Timeout: 30 * time.Second, + Timeout: 180 * time.Second, } res, err := client.Do(req) if err != nil { @@ -59,27 +84,40 @@ func (repeater ReleemConfigurationsRepeater) ProcessMetrics(context m.MetricCont return nil, err } defer res.Body.Close() - repeater.logger.Println(" * Downloading recommended MySQL configuration from Releem Cloud Platform...") body_res, err := io.ReadAll(res.Body) if err != nil { repeater.logger.Error("Response: error read body request: ", err) return nil, err } - if res.StatusCode != 200 { - repeater.logger.Println("Response: status code: ", res.StatusCode) - repeater.logger.Println("Response: body:\n", string(body_res)) + if res.StatusCode != 200 && res.StatusCode != 201 { + repeater.logger.Error("Response: status code: ", res.StatusCode) + repeater.logger.Error("Response: body:\n", string(body_res)) } else { repeater.logger.Debug("Response: status code: ", res.StatusCode) repeater.logger.Debug("Response: body:\n", string(body_res)) - err = os.WriteFile(context.GetReleemConfDir()+"/z_aiops_mysql.cnf", body_res, 0644) - if err != nil { - repeater.logger.Error("WriteFile: Error write to file: ", err) + + if repeater.Mode.Name == "Configurations" { + err = os.WriteFile(context.GetReleemConfDir()+"/z_aiops_mysql.cnf", body_res, 0644) + if err != nil { + repeater.logger.Error("WriteFile: Error write to file: ", err) + return nil, err + } + return string(body_res), err + + } else if repeater.Mode.Name == "Metrics" { + return string(body_res), err + } else if repeater.Mode.Name == "Event" { + return nil, err + } else if repeater.Mode.Name == "TaskGet" { + result_data := m.Task{} + err := json.Unmarshal(body_res, &result_data) + return result_data, err + } else if repeater.Mode.Name == "TaskSet" { + return nil, err + } else if repeater.Mode.Name == "TaskStatus" { return nil, err } - repeater.logger.Println("1. Recommended MySQL configuration downloaded to ", context.GetReleemConfDir()) - repeater.logger.Println("2. To check MySQL Performance Score please visit https://app.releem.com/dashboard?menu=metrics") - repeater.logger.Println("3. To apply the recommended configuration please read documentation https://app.releem.com/dashboard") } return nil, err } diff --git a/repeater/releemEvents.go b/repeater/releemEvents.go deleted file mode 100644 index 75fd779..0000000 --- a/repeater/releemEvents.go +++ /dev/null @@ -1,67 +0,0 @@ -package repeater - -import ( - "net/http" - "strings" - - "encoding/json" - - "github.com/Releem/mysqlconfigurer/config" - m "github.com/Releem/mysqlconfigurer/metrics" - "github.com/advantageous/go-logback/logging" - - "time" -) - -type ReleemEventRepeater struct { - logger logging.Logger - configuration *config.Config - Mode m.Mode -} - -func (repeater ReleemEventRepeater) ProcessMetrics(context m.MetricContext, metrics m.Metrics) (interface{}, error) { - e, _ := json.Marshal(metrics) - bodyReader := strings.NewReader(string(e)) - repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain string - env := context.GetEnv() - if env == "dev2" { - api_domain = "https://api.dev2.releem.com/v2/event/" - } else if env == "dev" { - api_domain = "https://api.dev.releem.com/v2/event/" - } else if env == "stage" { - api_domain = "https://api.stage.releem.com/v2/event/" - } else { - api_domain = "https://api.releem.com/v2/event/" - } - api_domain += repeater.Mode.ModeType - - req, err := http.NewRequest(http.MethodPost, api_domain, bodyReader) - if err != nil { - repeater.logger.Error("Request: could not create request: ", err) - return nil, err - } - req.Header.Set("x-releem-api-key", context.GetApiKey()) - - client := http.Client{ - Timeout: 30 * time.Second, - } - - res, err := client.Do(req) - if err != nil { - repeater.logger.Error("Request: error making http request: ", err) - return nil, err - } - repeater.logger.Debug("Response: status code: ", res) - return nil, err -} - -func NewReleemEventRepeater(configuration *config.Config, Mode m.Mode) ReleemEventRepeater { - var logger logging.Logger - if configuration.Debug { - logger = logging.NewSimpleDebugLogger("ReleemRepeaterMetrics") - } else { - logger = logging.NewSimpleLogger("ReleemRepeaterMetrics") - } - return ReleemEventRepeater{logger, configuration, Mode} -} diff --git a/repeater/releemMetrics.go b/repeater/releemMetrics.go deleted file mode 100644 index 6cb0c93..0000000 --- a/repeater/releemMetrics.go +++ /dev/null @@ -1,72 +0,0 @@ -package repeater - -import ( - "io" - "net/http" - "strings" - - "encoding/json" - - "github.com/Releem/mysqlconfigurer/config" - m "github.com/Releem/mysqlconfigurer/metrics" - "github.com/advantageous/go-logback/logging" - - "time" -) - -type ReleemMetricsRepeater struct { - logger logging.Logger - configuration *config.Config -} - -func (repeater ReleemMetricsRepeater) ProcessMetrics(context m.MetricContext, metrics m.Metrics) (interface{}, error) { - e, _ := json.Marshal(metrics) - bodyReader := strings.NewReader(string(e)) - repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain string - env := context.GetEnv() - if env == "dev2" { - api_domain = "https://api.dev2.releem.com/v2/metrics" - } else if env == "dev" { - api_domain = "https://api.dev.releem.com/v2/metrics" - } else if env == "stage" { - api_domain = "https://api.stage.releem.com/v2/metrics" - } else { - api_domain = "https://api.releem.com/v2/metrics" - } - req, err := http.NewRequest(http.MethodPost, api_domain, bodyReader) - if err != nil { - repeater.logger.Error("Request: could not create request: ", err) - return nil, err - } - req.Header.Set("x-releem-api-key", context.GetApiKey()) - - client := http.Client{ - Timeout: 30 * time.Second, - } - - res, err := client.Do(req) - if err != nil { - repeater.logger.Error("Request: error making http request: ", err) - return nil, err - } - repeater.logger.Debug("Response: status code: ", res.StatusCode) - defer res.Body.Close() - body_res, err := io.ReadAll(res.Body) - if err != nil { - repeater.logger.Error("Response: error read body request: ", err) - return nil, err - } - repeater.logger.Debug("Response: body:\n", string(body_res)) - return string(body_res), err -} - -func NewReleemMetricsRepeater(configuration *config.Config) ReleemMetricsRepeater { - var logger logging.Logger - if configuration.Debug { - logger = logging.NewSimpleDebugLogger("ReleemRepeaterMetrics") - } else { - logger = logging.NewSimpleLogger("ReleemRepeaterMetrics") - } - return ReleemMetricsRepeater{logger, configuration} -} diff --git a/tasks/taskGet.go b/tasks/taskGet.go deleted file mode 100644 index 0e2d6f8..0000000 --- a/tasks/taskGet.go +++ /dev/null @@ -1,82 +0,0 @@ -package tasks - -import ( - "io" - "net/http" - "strings" - - "encoding/json" - - "github.com/Releem/mysqlconfigurer/config" - m "github.com/Releem/mysqlconfigurer/metrics" - "github.com/advantageous/go-logback/logging" - - "time" -) - -type ReleemTaskGetRepeater struct { - logger logging.Logger -} - -func (repeater ReleemTaskGetRepeater) ProcessMetrics(context m.MetricContext, metrics m.Metrics) (interface{}, error) { - result_data := m.Task{} - e, _ := json.Marshal(metrics) - bodyReader := strings.NewReader(string(e)) - repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain string - env := context.GetEnv() - if env == "dev2" { - api_domain = "https://api.dev2.releem.com/v2/task/task_get" - } else if env == "dev" { - api_domain = "https://api.dev.releem.com/v2/task/task_get" - } else if env == "stage" { - api_domain = "https://api.stage.releem.com/v2/task/task_get" - } else { - api_domain = "https://api.releem.com/v2/task/task_get" - } - req, err := http.NewRequest(http.MethodPost, api_domain, bodyReader) - if err != nil { - repeater.logger.Error("Request: could not create request: ", err) - return result_data, err - } - req.Header.Set("x-releem-api-key", context.GetApiKey()) - client := http.Client{ - Timeout: 30 * time.Second, - } - res, err := client.Do(req) - if err != nil { - repeater.logger.Error("Request: error making http request: ", err) - return result_data, err - } - defer res.Body.Close() - - body_res, err := io.ReadAll(res.Body) - if err != nil { - repeater.logger.Error("Response: error read body request: ", err) - return result_data, err - } - if res.StatusCode != 200 { - repeater.logger.Println("Response: status code: ", res.StatusCode) - repeater.logger.Println("Response: body:\n", string(body_res)) - } else { - repeater.logger.Debug("Response: status code: ", res.StatusCode) - repeater.logger.Debug("Response: body:\n", string(body_res)) - err := json.Unmarshal(body_res, &result_data) - - if err != nil { - repeater.logger.Error(err) - } - } - return result_data, err - -} - -func NewReleemTaskGetRepeater(configuration *config.Config) ReleemTaskGetRepeater { - var logger logging.Logger - if configuration.Debug { - logger = logging.NewSimpleDebugLogger("ReleemRepeaterTasks") - } else { - logger = logging.NewSimpleLogger("ReleemRepeaterTasks") - } - return ReleemTaskGetRepeater{logger} -} diff --git a/tasks/taskSet.go b/tasks/taskSet.go deleted file mode 100644 index ee67c82..0000000 --- a/tasks/taskSet.go +++ /dev/null @@ -1,102 +0,0 @@ -package tasks - -import ( - "net/http" - "strings" - - "encoding/json" - - "github.com/Releem/mysqlconfigurer/config" - m "github.com/Releem/mysqlconfigurer/metrics" - "github.com/advantageous/go-logback/logging" - - "time" -) - -type ReleemTaskSetRepeater struct { - logger logging.Logger - Mode m.Mode -} - -func (repeater ReleemTaskSetRepeater) ProcessMetrics(context m.MetricContext, metrics m.Metrics) (interface{}, error) { - if repeater.Mode.ModeType == "collect_queries" { - e, _ := json.Marshal(metrics) - bodyReader := strings.NewReader(string(e)) - repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain_queries string - env := context.GetEnv() - if env == "dev2" { - api_domain_queries = "https://api.queries.dev2.releem.com/v2/task/" - } else if env == "dev" { - api_domain_queries = "https://api.queries.dev.releem.com/v2/task/" - } else if env == "stage" { - api_domain_queries = "https://api.queries.stage.releem.com/v2/task/" - } else { - api_domain_queries = "https://api.queries.releem.com/v2/task/" - } - api_domain_queries += repeater.Mode.ModeType - - req, err := http.NewRequest(http.MethodPost, api_domain_queries, bodyReader) - if err != nil { - repeater.logger.Error("Request: could not create request: ", err) - } else { - req.Header.Set("x-releem-api-key", context.GetApiKey()) - - client := http.Client{ - Timeout: 180 * time.Second, - } - - res, err := client.Do(req) - if err != nil { - repeater.logger.Error("Request: error making http request: ", err) - } else { - repeater.logger.Debug("Response: status code: ", res) - } - } - } - metrics.DB.QueriesOptimization = nil - e, _ := json.Marshal(metrics) - bodyReader := strings.NewReader(string(e)) - repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain string - env := context.GetEnv() - if env == "dev2" { - api_domain = "https://api.dev2.releem.com/v2/task/" - } else if env == "dev" { - api_domain = "https://api.dev.releem.com/v2/task/" - } else if env == "stage" { - api_domain = "https://api.stage.releem.com/v2/task/" - } else { - api_domain = "https://api.releem.com/v2/task/" - } - api_domain += repeater.Mode.ModeType - - req, err := http.NewRequest(http.MethodPost, api_domain, bodyReader) - if err != nil { - repeater.logger.Error("Request: could not create request: ", err) - return nil, err - } - req.Header.Set("x-releem-api-key", context.GetApiKey()) - - client := http.Client{ - Timeout: 30 * time.Second, - } - - res, err := client.Do(req) - if err != nil { - repeater.logger.Error("Request: error making http request: ", err) - return nil, err - } - repeater.logger.Debug("Response: status code: ", res) - return nil, err -} - -func NewReleemTaskSetRepeater(configuration *config.Config, Mode m.Mode) ReleemTaskSetRepeater { - var logger logging.Logger - if configuration.Debug { - logger = logging.NewSimpleDebugLogger("ReleemRepeaterMetrics") - } else { - logger = logging.NewSimpleLogger("ReleemRepeaterMetrics") - } - return ReleemTaskSetRepeater{logger, Mode} -} diff --git a/tasks/taskStatus.go b/tasks/taskStatus.go deleted file mode 100644 index a28bb7b..0000000 --- a/tasks/taskStatus.go +++ /dev/null @@ -1,68 +0,0 @@ -package tasks - -import ( - "net/http" - "strings" - - "encoding/json" - - "github.com/Releem/mysqlconfigurer/config" - m "github.com/Releem/mysqlconfigurer/metrics" - "github.com/advantageous/go-logback/logging" - - "time" -) - -type ReleemTaskStatusRepeater struct { - logger logging.Logger -} - -func (repeater ReleemTaskStatusRepeater) ProcessMetrics(context m.MetricContext, metrics m.Metrics) (interface{}, error) { - e, _ := json.Marshal(metrics) - bodyReader := strings.NewReader(string(e)) - repeater.logger.Debug("Result Send data: ", string(e)) - var api_domain string - env := context.GetEnv() - if env == "dev2" { - api_domain = "https://api.dev2.releem.com/v2/task/task_status" - } else if env == "dev" { - api_domain = "https://api.dev.releem.com/v2/task/task_status" - } else if env == "stage" { - api_domain = "https://api.stage.releem.com/v2/task/task_status" - } else { - api_domain = "https://api.releem.com/v2/task/task_status" - } - req, err := http.NewRequest(http.MethodPost, api_domain, bodyReader) - if err != nil { - repeater.logger.Error("Request: could not create request: ", err) - return nil, err - } - req.Header.Set("x-releem-api-key", context.GetApiKey()) - - client := http.Client{ - Timeout: 30 * time.Second, - } - - res, err := client.Do(req) - if err != nil { - repeater.logger.Error("Request: error making http request: ", err) - return nil, err - } - if res.StatusCode != 201 { - repeater.logger.Println("Response: status code: ", res.StatusCode) - repeater.logger.Println("Response: \n", res) - } else { - repeater.logger.Debug("Response: status code: ", res.StatusCode) - } - return nil, err -} - -func NewReleemTaskStatusRepeater(configuration *config.Config) ReleemTaskStatusRepeater { - var logger logging.Logger - if configuration.Debug { - logger = logging.NewSimpleDebugLogger("ReleemRepeaterTaskStatus") - } else { - logger = logging.NewSimpleLogger("ReleemRepeaterTaskStatus") - } - return ReleemTaskStatusRepeater{logger} -}