diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 2676dc67ffd..cf09f8c7bf4 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -161,6 +161,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add support for NATS 2.1. {pull}16317[16317] - Add Load Balancing metricset to GCP {pull}15559[15559] - Add support for Dropwizard metrics 4.1. {pull}16332[16332] +- Improve the `haproxy` module to support metrics exposed via HTTPS. {issue}14579[14579] {pull}16333[16333] *Packetbeat* diff --git a/metricbeat/docs/modules/haproxy.asciidoc b/metricbeat/docs/modules/haproxy.asciidoc index 588b996e1e7..b22d8244df4 100644 --- a/metricbeat/docs/modules/haproxy.asciidoc +++ b/metricbeat/docs/modules/haproxy.asciidoc @@ -62,6 +62,9 @@ metricbeat.modules: enabled: true ---- +This module supports TLS connections when using `ssl` config field, as described in <>. +It also supports the options described in <>. + [float] === Metricsets diff --git a/metricbeat/module/haproxy/_meta/Dockerfile b/metricbeat/module/haproxy/_meta/Dockerfile index a63a3b0e720..42a01358ee3 100644 --- a/metricbeat/module/haproxy/_meta/Dockerfile +++ b/metricbeat/module/haproxy/_meta/Dockerfile @@ -1,6 +1,11 @@ ARG HAPROXY_VERSION FROM haproxy:${HAPROXY_VERSION} RUN apt-get update && apt-get install -y netcat -HEALTHCHECK --interval=1s --retries=90 CMD nc -z localhost 14567 + +HEALTHCHECK --interval=1s --retries=90 CMD nc -z localhost 14567 && nc -z localhost 14570 + COPY ./haproxy.conf /usr/local/etc/haproxy/haproxy.cfg -EXPOSE 14567 +COPY ./certs/server.pem /usr/local/etc/haproxy/server.pem +COPY ./certs/ca.crt /usr/local/etc/haproxy/ca.crt + +EXPOSE 14567 14568 14569 14570 diff --git a/metricbeat/module/haproxy/_meta/certs/ca.crt b/metricbeat/module/haproxy/_meta/certs/ca.crt new file mode 100644 index 00000000000..4a1467ee575 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/ca.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFHjCCAwYCCQDyebXXoth88jANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEV +MBMGA1UEAwwMY2FAbG9jYWxob3N0MB4XDTIwMDIxNDE1MzAzOVoXDTMwMDIxMTE1 +MzAzOVowUTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNV +BAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAMMDGNhQGxvY2FsaG9zdDCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMglbylESpU851HoBkCC/hrG3rlb7bEI +PiLvEZeVsWYFXjcTPFG8PzZP2N1DjLtuoxgReDLbBhAqo26FRN8UWsOE9YANhfCy +PXYA1qkK5Mdbv4X5m6FX+pMwGmlzdJjTyK6k0crpUA+fvveffyENMDGrFoEHNFn4 +5Mp0/zafaPD+RCd+y48qUFeBkM1JKkSD6OV4MnZIZi8ttQIzoB5JoL6U6MOE/rpe +xjUc4OQefTJ9Y3QkhUyAn5TB0VpdEZzgp4VA5NO32uusobWA6a1KyVAtHqfSELG2 +4cPswjWSCXeglMvGbRWCBtyH/9vQ+RyhlBPclTUnBOTHRJSk7DbELCqFRNpASPdK +oH20a/0MM5gSVVfkdxp+VZC60RxjkGXSMwMF0/RGE7UgrwLIfwwzN1Op7BYqB/RV +433FBE0o3YRlSky8+t1/p0+mkLIoaOM4HCtmAthJ2L1B3X8+mAvC65nbkpOnoDQ6 ++r2FKTqmZOB0KDABrUnW9/Fgf6+vQlgH+cL01f9uhZqyyaoVL5KqhWqiAyZRK0/i +qMBR8ezZvGrfBE5jTwFs5dIOYKTDGG2UQQjRLV5zSo6n2P9qSEBCO01n+5A1AaZ+ +xxjRFDAEDvs8M4f6X47E/aKSvKbai9GayHKb2U/rDqIy5tEAKPa11xjdVAUi7LBt +HLkMYHL6a/zlAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAIncpkUN5oWGDCmF912u +JS9uJYonmcjCwz5j6OTfyiwDk0mV6irEYNhYyRQZGlz56TbfXYxDZbr+AKjb9F9D +5BiHy+Mjo5DSPMCGREyDEPAL8wB/lMQ64tIt7+CK1ua+05FzSH2DhCsJEX3L+0qb +bPy5ZDfP7hVrjQvM+BNFcfEXAznBEJ2+zWQ8hiBXwgZXCFclKJsfxRhm8lhSUPE2 +k7DSWwmqVF1/Pvf8dY/QxESrHEdeHuB7QjPcvXPRZ9s01bZQJwFo92UwmkhnWJMg +nl3imYhypiWWlGPM2qhMmVrCPdipaxvlxTGUXRhDIOW7XvQFkqyG+abZfWthHwWX +ILURqpBgG4ZQu/S9Insx0XQbw/hKATdSgJ1RvZ7dFsaGG439hujv7Iw6VC7KS+JF +BN9ecA42eNB6AJiC4wJdSEm5N+cI2+SLNpavaywNEnxWUOYSDFmFdedk6MxZh+SK +zcY5Zpda1cqTZbZcWb5ewR20p9CrgRqsLYB5fxaOuGKF/mIyChezwYG6g5YvqHOm +K+gq/MxpVCTIjx+pFT3Y0eTv3+S4+o/R9vS/K8MokGrBqkui78eqJylW8rWWqBBc +QBSI6y7hEs9KaP84dj5PtO1YCSAbLV/MC0G0/sJVGn8PSdiKTp5uMHpoozgaW6+j +LuWTqxnwHUNupqZ6DvO8VPHT +-----END CERTIFICATE----- diff --git a/metricbeat/module/haproxy/_meta/certs/ca.key b/metricbeat/module/haproxy/_meta/certs/ca.key new file mode 100644 index 00000000000..f08ff369556 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/ca.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/metricbeat/module/haproxy/_meta/certs/ca.pem b/metricbeat/module/haproxy/_meta/certs/ca.pem new file mode 100644 index 00000000000..4a1467ee575 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/ca.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFHjCCAwYCCQDyebXXoth88jANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEV +MBMGA1UEAwwMY2FAbG9jYWxob3N0MB4XDTIwMDIxNDE1MzAzOVoXDTMwMDIxMTE1 +MzAzOVowUTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNV +BAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAMMDGNhQGxvY2FsaG9zdDCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMglbylESpU851HoBkCC/hrG3rlb7bEI +PiLvEZeVsWYFXjcTPFG8PzZP2N1DjLtuoxgReDLbBhAqo26FRN8UWsOE9YANhfCy +PXYA1qkK5Mdbv4X5m6FX+pMwGmlzdJjTyK6k0crpUA+fvveffyENMDGrFoEHNFn4 +5Mp0/zafaPD+RCd+y48qUFeBkM1JKkSD6OV4MnZIZi8ttQIzoB5JoL6U6MOE/rpe +xjUc4OQefTJ9Y3QkhUyAn5TB0VpdEZzgp4VA5NO32uusobWA6a1KyVAtHqfSELG2 +4cPswjWSCXeglMvGbRWCBtyH/9vQ+RyhlBPclTUnBOTHRJSk7DbELCqFRNpASPdK +oH20a/0MM5gSVVfkdxp+VZC60RxjkGXSMwMF0/RGE7UgrwLIfwwzN1Op7BYqB/RV +433FBE0o3YRlSky8+t1/p0+mkLIoaOM4HCtmAthJ2L1B3X8+mAvC65nbkpOnoDQ6 ++r2FKTqmZOB0KDABrUnW9/Fgf6+vQlgH+cL01f9uhZqyyaoVL5KqhWqiAyZRK0/i +qMBR8ezZvGrfBE5jTwFs5dIOYKTDGG2UQQjRLV5zSo6n2P9qSEBCO01n+5A1AaZ+ +xxjRFDAEDvs8M4f6X47E/aKSvKbai9GayHKb2U/rDqIy5tEAKPa11xjdVAUi7LBt +HLkMYHL6a/zlAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAIncpkUN5oWGDCmF912u +JS9uJYonmcjCwz5j6OTfyiwDk0mV6irEYNhYyRQZGlz56TbfXYxDZbr+AKjb9F9D +5BiHy+Mjo5DSPMCGREyDEPAL8wB/lMQ64tIt7+CK1ua+05FzSH2DhCsJEX3L+0qb +bPy5ZDfP7hVrjQvM+BNFcfEXAznBEJ2+zWQ8hiBXwgZXCFclKJsfxRhm8lhSUPE2 +k7DSWwmqVF1/Pvf8dY/QxESrHEdeHuB7QjPcvXPRZ9s01bZQJwFo92UwmkhnWJMg +nl3imYhypiWWlGPM2qhMmVrCPdipaxvlxTGUXRhDIOW7XvQFkqyG+abZfWthHwWX +ILURqpBgG4ZQu/S9Insx0XQbw/hKATdSgJ1RvZ7dFsaGG439hujv7Iw6VC7KS+JF +BN9ecA42eNB6AJiC4wJdSEm5N+cI2+SLNpavaywNEnxWUOYSDFmFdedk6MxZh+SK +zcY5Zpda1cqTZbZcWb5ewR20p9CrgRqsLYB5fxaOuGKF/mIyChezwYG6g5YvqHOm +K+gq/MxpVCTIjx+pFT3Y0eTv3+S4+o/R9vS/K8MokGrBqkui78eqJylW8rWWqBBc +QBSI6y7hEs9KaP84dj5PtO1YCSAbLV/MC0G0/sJVGn8PSdiKTp5uMHpoozgaW6+j +LuWTqxnwHUNupqZ6DvO8VPHT +-----END CERTIFICATE----- diff --git a/metricbeat/module/haproxy/_meta/certs/client.crt b/metricbeat/module/haproxy/_meta/certs/client.crt new file mode 100644 index 00000000000..adebb8c47ef --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/client.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDjzCCAXcCAQIwDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAMM +DGNhQGxvY2FsaG9zdDAeFw0yMDAyMTQxNTMwMzlaFw0zMDAyMTExNTMwMzlaME4x +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4g +RnJhbmNpc2NvMRIwEAYDVQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBALVn/XhBY8+TeHTqEUis/x4mkIJIbaL2AtDk6jchbcbwJkV/cl6k +yslxXgF5d2/QWd12QxUbQIyzkv15DagBErtWSJmYtX1VT1b90S+CRO2ZDjb7blnz +dYBSeojRCpHEfDWfnimCuFfLSSZpDaHm4WYUOk5Z2kUFEgiS04M9ahkjAgMBAAEw +DQYJKoZIhvcNAQEFBQADggIBAA0sIF9wtEkBR4PPsnBPu07s5mYFdg9ID8XEQ06K +vnYehdFUMPuQrzFkwWwpJ3saqZ3NY69D1kMgSapYS3ykUuB0/fRJVqm6/XbCbXSh +4Ufyhoe/G4jJDiI56Evnh12AI68hzlexAS83t8utVQnkqDkNLUYbVdIx1OJ8e88J +ekc1AyHq09/3sJMRcYnzBlpiaBK3zfwj1V+hlUzFKSqzZvrIouNvHAL7Knu6XOEK +jE23VLro50lJl33Ew7/SHuMWDTyHOW9YGeeVoZl7ZbJNRtvM84FZ6kSdA+w8Cym5 +DIO3DG4WkKET/VAzPGQD8XwQpvi7bQ2+RCTW32OQTAWvtO/OyYBL1v0s7lFN3rcW +LfwPd90Ht9KT2tZ93tA1x6FZ2i6zyyH9qTSAc+TrrTJp4YyWg83Yx8dv4dMoWwYH +D/zdU+TS3UX5aXuJI2VfafxnLsP9XCNeqzFFuomAu6Mq93M9yHbBtBFJkkm+nL/z +OVUiFjcqYlDcL8Dqi60EgjLewa90+k7eTmEj7Z8i4IwJL9pSXcfCpB5M0ZIZgdsa +nGITtg4bZJywAYJzKlgrql1oYecNfUAr8ltXXXbBb1C3WBsVBlJghbp3OjFur3RY +3Y9E81l4lScP2YcPrFEo2tJvetEOPjg78h0WmzrmjPzRCc0CUWvA+/45GL7fon4A +IDll +-----END CERTIFICATE----- diff --git a/metricbeat/module/haproxy/_meta/certs/client.csr b/metricbeat/module/haproxy/_meta/certs/client.csr new file mode 100644 index 00000000000..e2fb9882ca7 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/client.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBjTCB9wIBADBOMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEW +MBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAGA1UEAwwJbG9jYWxob3N0MIGfMA0G +CSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1Z/14QWPPk3h06hFIrP8eJpCCSG2i9gLQ +5Oo3IW3G8CZFf3JepMrJcV4BeXdv0FnddkMVG0CMs5L9eQ2oARK7VkiZmLV9VU9W +/dEvgkTtmQ42+25Z83WAUnqI0QqRxHw1n54pgrhXy0kmaQ2h5uFmFDpOWdpFBRII +ktODPWoZIwIDAQABoAAwDQYJKoZIhvcNAQELBQADgYEADftPLHJCElz0m4dMiI4V +Db3jC6X5dtEB2QE0kiGmkbvYL+8YOBgag7bC/6FvniFrc+9ntrqQZNvWycfy/7Mg +GY+tYm1meFV02dbR+LafNfyNX9ztjDo1TNJgBJooFlxsM5weL9oSrmlK5BDDLEoz +JYBXa0PU7BRMKxOAfE2Lqmc= +-----END CERTIFICATE REQUEST----- diff --git a/metricbeat/module/haproxy/_meta/certs/client.key b/metricbeat/module/haproxy/_meta/certs/client.key new file mode 100644 index 00000000000..a8013734b49 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/client.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQC1Z/14QWPPk3h06hFIrP8eJpCCSG2i9gLQ5Oo3IW3G8CZFf3Je +pMrJcV4BeXdv0FnddkMVG0CMs5L9eQ2oARK7VkiZmLV9VU9W/dEvgkTtmQ42+25Z +83WAUnqI0QqRxHw1n54pgrhXy0kmaQ2h5uFmFDpOWdpFBRIIktODPWoZIwIDAQAB +AoGARub5M9pi94vNJe0iikRLhm5ORw2mBG6hFSKTxK6FKJ9OZhV1Dzbbp7Zupqbi +HsrRhPSnLYW0SgoZ5oY85zBcMEHxC7HCeH0rhmZkGTgD+2x/0oDXOuH/kmTegCh5 +O8hShwIBSULIg99VH8JOejBj82Wpf5Y3VqaGVjSNWo6HPdkCQQDeznoKrIk3hzpq ++7YaXJs8lXbGZ6xz4WpS4pp23Xrdsdiec/EwUnpDKc9CDTVvYm6fawVRf6rA3oYp +3wFA9h/NAkEA0G6QTPs/xo168vj6MwQ4kk7D8DWF5ja6CbLYU05lutK5n/0p62ul +OesUhF/kjsfqf2yuOefXV4zMv15vQh/MrwJAcfDvkoPXjFEYe9uLrgGL1bitzBr6 +oyw0vnxp972d9r/bgnTSdB7JrY01E5dDq1mQLvCBAMOkJAvoWoNT1c/IRQJBAI4C +hrasiKtTQe3BzVZtDc5BdCZ5kR1lNCPfgpxf0dgUMvzalHEeCpkHnhcC7sqJUzA2 +cA5r88Bm4imQweUfnWkCQECZa3sHls3tNtFbEQ1p8JOb6iRLAKTe0pEhfhEAkVGA +zVghjTIOAB8bBjwqa7hLl2G31tanpdMfySyxDKyecpc= +-----END RSA PRIVATE KEY----- diff --git a/metricbeat/module/haproxy/_meta/certs/client.pem b/metricbeat/module/haproxy/_meta/certs/client.pem new file mode 100644 index 00000000000..adebb8c47ef --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/client.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDjzCCAXcCAQIwDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAMM +DGNhQGxvY2FsaG9zdDAeFw0yMDAyMTQxNTMwMzlaFw0zMDAyMTExNTMwMzlaME4x +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4g +RnJhbmNpc2NvMRIwEAYDVQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBALVn/XhBY8+TeHTqEUis/x4mkIJIbaL2AtDk6jchbcbwJkV/cl6k +yslxXgF5d2/QWd12QxUbQIyzkv15DagBErtWSJmYtX1VT1b90S+CRO2ZDjb7blnz +dYBSeojRCpHEfDWfnimCuFfLSSZpDaHm4WYUOk5Z2kUFEgiS04M9ahkjAgMBAAEw +DQYJKoZIhvcNAQEFBQADggIBAA0sIF9wtEkBR4PPsnBPu07s5mYFdg9ID8XEQ06K +vnYehdFUMPuQrzFkwWwpJ3saqZ3NY69D1kMgSapYS3ykUuB0/fRJVqm6/XbCbXSh +4Ufyhoe/G4jJDiI56Evnh12AI68hzlexAS83t8utVQnkqDkNLUYbVdIx1OJ8e88J +ekc1AyHq09/3sJMRcYnzBlpiaBK3zfwj1V+hlUzFKSqzZvrIouNvHAL7Knu6XOEK +jE23VLro50lJl33Ew7/SHuMWDTyHOW9YGeeVoZl7ZbJNRtvM84FZ6kSdA+w8Cym5 +DIO3DG4WkKET/VAzPGQD8XwQpvi7bQ2+RCTW32OQTAWvtO/OyYBL1v0s7lFN3rcW +LfwPd90Ht9KT2tZ93tA1x6FZ2i6zyyH9qTSAc+TrrTJp4YyWg83Yx8dv4dMoWwYH +D/zdU+TS3UX5aXuJI2VfafxnLsP9XCNeqzFFuomAu6Mq93M9yHbBtBFJkkm+nL/z +OVUiFjcqYlDcL8Dqi60EgjLewa90+k7eTmEj7Z8i4IwJL9pSXcfCpB5M0ZIZgdsa +nGITtg4bZJywAYJzKlgrql1oYecNfUAr8ltXXXbBb1C3WBsVBlJghbp3OjFur3RY +3Y9E81l4lScP2YcPrFEo2tJvetEOPjg78h0WmzrmjPzRCc0CUWvA+/45GL7fon4A +IDll +-----END CERTIFICATE----- diff --git a/metricbeat/module/haproxy/_meta/certs/generate.sh b/metricbeat/module/haproxy/_meta/certs/generate.sh new file mode 100755 index 00000000000..4f436433a98 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/generate.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +export CA_SUBJECT='/C=US/ST=California/L=San Francisco/CN=ca@localhost' +export SERVER_SUBJECT='/C=US/ST=California/L=San Francisco/CN=localhost' +export CLIENT_SUBJECT='/C=US/ST=California/L=San Francisco/CN=localhost' + +# certificate authority creation +openssl genrsa -out ca.key 4096 +openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "$CA_SUBJECT" +openssl x509 -in ca.crt -out ca.pem -outform PEM + +# server certificate creation +openssl genrsa -out server.key 1024 +openssl req -new -key server.key -out server.csr -subj "$SERVER_SUBJECT" +openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt +cat server.crt server.key > server.pem + +# client certificate creation +openssl genrsa -out client.key 1024 +openssl req -new -key client.key -out client.csr -subj "$CLIENT_SUBJECT" +openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt +openssl x509 -in client.crt -out client.pem -outform PEM diff --git a/metricbeat/module/haproxy/_meta/certs/server.crt b/metricbeat/module/haproxy/_meta/certs/server.crt new file mode 100644 index 00000000000..1590e38f92c --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/server.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDjzCCAXcCAQEwDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAMM +DGNhQGxvY2FsaG9zdDAeFw0yMDAyMTQxNTMwMzlaFw0zMDAyMTExNTMwMzlaME4x +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4g +RnJhbmNpc2NvMRIwEAYDVQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBAKXBZav38p8UvmpEwzdKetg+oX+7mjmeM+vxOklSj+tl8hfOp8S1 +48Q2DE08b0x/ZnuyitFPO3mG24+bX1n2ZmGwN3vyVDSV8yL3ph+SJl+gum8ttqoY +VkFGGKQKnAs2BdBf3dxxdpNagt6p48HSYNWYHO4soste+R49r6UCZoN5AgMBAAEw +DQYJKoZIhvcNAQEFBQADggIBAKdbjIBJcQCVSFwvLL17jOcqlXp1y/oXemRFrctT +w/1sJxDnkLwa/ypX7s0Nj0YFnmm+F8vBg1y6LpxGR+etlgx2rmwXxNuSlb7ZGmo6 ++eFOIJcF1/9EX2nRfW305+Poa51wO8i9kouyIUxAXymLeKGkzZbwh3VRyUSaPPSG +vL94OPzSwyF9sJVzvx36O5b5wQ/EN688y8ZqxOABt6XbfmmwFAVhSVBIv9ak7vao +O8POzMLtXmaplN08N+xI1HxMTVa/FLmNnsTHSeCbQEMkhATRwt0KRud6Mz/B/MaZ +K5Cumzsn26vCC2Tu59vbH0mcZf8PaSLrfkFR6pJCBzWn0dL4jse+MWy/X+LhvwZi +xm9JkNhTNTNVZmoyF+tYZ27YH7VFxAeLKk0PKP8ywkzVhAnKAYOV/J7tmwUUCnXU +RxuIUC4kKDnzi3HLftDXNFpxT1eKFwQ4oRuHqqZeu1bMgo6XNb3GV0kpT5QGzbtO +vJysh3KcgMhVmGMwStMuWKtAiFPF2FSVX56/q6NQh0yJ9AVu3b4UnVIq/Ir/+yDD +lgEq+bac8buaGe3ewwwm8HhuCmCqPv0+kZMYGZjzzJ4RZKXhiWUroNhDmSZO5TEh +B+NOlp0F2C1fLhDRZOwY1kYiHYCMm2+tH5VEimbqa+DHko2k8oCsVeh8+pt2sebl +/s7w +-----END CERTIFICATE----- diff --git a/metricbeat/module/haproxy/_meta/certs/server.csr b/metricbeat/module/haproxy/_meta/certs/server.csr new file mode 100644 index 00000000000..f4dd37ac735 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/server.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBjTCB9wIBADBOMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEW +MBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAGA1UEAwwJbG9jYWxob3N0MIGfMA0G +CSqGSIb3DQEBAQUAA4GNADCBiQKBgQClwWWr9/KfFL5qRMM3SnrYPqF/u5o5njPr +8TpJUo/rZfIXzqfEtePENgxNPG9Mf2Z7sorRTzt5htuPm19Z9mZhsDd78lQ0lfMi +96YfkiZfoLpvLbaqGFZBRhikCpwLNgXQX93ccXaTWoLeqePB0mDVmBzuLKLLXvke +Pa+lAmaDeQIDAQABoAAwDQYJKoZIhvcNAQELBQADgYEAjlJJcJsKt3Yg4nSGPY2H +P0KHydW/vmks6GAON2WtAGNjwKN1QTAO5LOMeY5PcKGiw6ImfaSUz52ag4Bg2pqm +yjnHqUtK/RQuFM8wHjNmjDZDcXb3vx6nW8J8tL2ve2lXrWxBD1oCcUWPT3H7QwR1 ++ml6RdZMbHtbHLGqc4gg2q8= +-----END CERTIFICATE REQUEST----- diff --git a/metricbeat/module/haproxy/_meta/certs/server.key b/metricbeat/module/haproxy/_meta/certs/server.key new file mode 100644 index 00000000000..38577f148cb --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/server.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQClwWWr9/KfFL5qRMM3SnrYPqF/u5o5njPr8TpJUo/rZfIXzqfE +tePENgxNPG9Mf2Z7sorRTzt5htuPm19Z9mZhsDd78lQ0lfMi96YfkiZfoLpvLbaq +GFZBRhikCpwLNgXQX93ccXaTWoLeqePB0mDVmBzuLKLLXvkePa+lAmaDeQIDAQAB +AoGAAI3L5C447lUoabx/FoE2NeDHs2CSHF0t+TzeH/6ZooS9sVysbNjawP4ZPmzU +RmIqmoE3O4nTPg24UBuJzwgmwW1vq5wZ0jEPYNDLSFXv3Qr5UPEH9zVc5TfDGn9h +k7klB5aAJeLposcTXwJUW/xAg8M61SSzPg5K14aXWWAV8oECQQDVMGzhF+8HJYpd +rY85IeDT6bTFGV4XsxsEFYjRU8y+yYOqGKGtYYjYMFh9TCYWRxq9gzIslkrYLI1z +TZnFc8PxAkEAxwqDD5AYG5R2gCOpztlEiu84P89IHJIa9/4ggIA7SMQ14VSO3AUJ +rWZME50VwoeYFYVtDstTezqo1Qy/6r6gCQJAQ2eRNUYs9BSBgAbtHsJAZKAi4KKZ +pmKhqxPn809MkBIEyBYLoFcTPk9i2xLlg+utX7gIeCJ4vYqwmoExmkV08QJBAL5A +cwQGNLTwFNDoxeAc1yKCBF8hz4jXswWGmCSb7Y7hVasbey4ddqGTHXbF+M2ndBxm +G9c/TH2GlWiHtk44hZkCQQDCbLT0uFlZxpN5OTAq2a58vmwDcJ2XjXdF+jAXmkbE +gYel1LbxpHM/uh81J+5wO89zYZd/pn9J8IFn6IlvrzyF +-----END RSA PRIVATE KEY----- diff --git a/metricbeat/module/haproxy/_meta/certs/server.pem b/metricbeat/module/haproxy/_meta/certs/server.pem new file mode 100644 index 00000000000..3e7fed00554 --- /dev/null +++ b/metricbeat/module/haproxy/_meta/certs/server.pem @@ -0,0 +1,37 @@ +-----BEGIN CERTIFICATE----- +MIIDjzCCAXcCAQEwDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xFTATBgNVBAMM +DGNhQGxvY2FsaG9zdDAeFw0yMDAyMTQxNTMwMzlaFw0zMDAyMTExNTMwMzlaME4x +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4g +RnJhbmNpc2NvMRIwEAYDVQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBAKXBZav38p8UvmpEwzdKetg+oX+7mjmeM+vxOklSj+tl8hfOp8S1 +48Q2DE08b0x/ZnuyitFPO3mG24+bX1n2ZmGwN3vyVDSV8yL3ph+SJl+gum8ttqoY +VkFGGKQKnAs2BdBf3dxxdpNagt6p48HSYNWYHO4soste+R49r6UCZoN5AgMBAAEw +DQYJKoZIhvcNAQEFBQADggIBAKdbjIBJcQCVSFwvLL17jOcqlXp1y/oXemRFrctT +w/1sJxDnkLwa/ypX7s0Nj0YFnmm+F8vBg1y6LpxGR+etlgx2rmwXxNuSlb7ZGmo6 ++eFOIJcF1/9EX2nRfW305+Poa51wO8i9kouyIUxAXymLeKGkzZbwh3VRyUSaPPSG +vL94OPzSwyF9sJVzvx36O5b5wQ/EN688y8ZqxOABt6XbfmmwFAVhSVBIv9ak7vao +O8POzMLtXmaplN08N+xI1HxMTVa/FLmNnsTHSeCbQEMkhATRwt0KRud6Mz/B/MaZ +K5Cumzsn26vCC2Tu59vbH0mcZf8PaSLrfkFR6pJCBzWn0dL4jse+MWy/X+LhvwZi +xm9JkNhTNTNVZmoyF+tYZ27YH7VFxAeLKk0PKP8ywkzVhAnKAYOV/J7tmwUUCnXU +RxuIUC4kKDnzi3HLftDXNFpxT1eKFwQ4oRuHqqZeu1bMgo6XNb3GV0kpT5QGzbtO +vJysh3KcgMhVmGMwStMuWKtAiFPF2FSVX56/q6NQh0yJ9AVu3b4UnVIq/Ir/+yDD +lgEq+bac8buaGe3ewwwm8HhuCmCqPv0+kZMYGZjzzJ4RZKXhiWUroNhDmSZO5TEh +B+NOlp0F2C1fLhDRZOwY1kYiHYCMm2+tH5VEimbqa+DHko2k8oCsVeh8+pt2sebl +/s7w +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQClwWWr9/KfFL5qRMM3SnrYPqF/u5o5njPr8TpJUo/rZfIXzqfE +tePENgxNPG9Mf2Z7sorRTzt5htuPm19Z9mZhsDd78lQ0lfMi96YfkiZfoLpvLbaq +GFZBRhikCpwLNgXQX93ccXaTWoLeqePB0mDVmBzuLKLLXvkePa+lAmaDeQIDAQAB +AoGAAI3L5C447lUoabx/FoE2NeDHs2CSHF0t+TzeH/6ZooS9sVysbNjawP4ZPmzU +RmIqmoE3O4nTPg24UBuJzwgmwW1vq5wZ0jEPYNDLSFXv3Qr5UPEH9zVc5TfDGn9h +k7klB5aAJeLposcTXwJUW/xAg8M61SSzPg5K14aXWWAV8oECQQDVMGzhF+8HJYpd +rY85IeDT6bTFGV4XsxsEFYjRU8y+yYOqGKGtYYjYMFh9TCYWRxq9gzIslkrYLI1z +TZnFc8PxAkEAxwqDD5AYG5R2gCOpztlEiu84P89IHJIa9/4ggIA7SMQ14VSO3AUJ +rWZME50VwoeYFYVtDstTezqo1Qy/6r6gCQJAQ2eRNUYs9BSBgAbtHsJAZKAi4KKZ +pmKhqxPn809MkBIEyBYLoFcTPk9i2xLlg+utX7gIeCJ4vYqwmoExmkV08QJBAL5A +cwQGNLTwFNDoxeAc1yKCBF8hz4jXswWGmCSb7Y7hVasbey4ddqGTHXbF+M2ndBxm +G9c/TH2GlWiHtk44hZkCQQDCbLT0uFlZxpN5OTAq2a58vmwDcJ2XjXdF+jAXmkbE +gYel1LbxpHM/uh81J+5wO89zYZd/pn9J8IFn6IlvrzyF +-----END RSA PRIVATE KEY----- diff --git a/metricbeat/module/haproxy/_meta/fields.yml b/metricbeat/module/haproxy/_meta/fields.yml index 4ad0a38af3d..b135cb1a500 100644 --- a/metricbeat/module/haproxy/_meta/fields.yml +++ b/metricbeat/module/haproxy/_meta/fields.yml @@ -4,6 +4,7 @@ HAProxy Module short_config: false release: ga + settings: ["ssl", "http"] fields: - name: haproxy type: group diff --git a/metricbeat/module/haproxy/_meta/haproxy.conf b/metricbeat/module/haproxy/_meta/haproxy.conf index a720525a228..83a829be21c 100644 --- a/metricbeat/module/haproxy/_meta/haproxy.conf +++ b/metricbeat/module/haproxy/_meta/haproxy.conf @@ -23,7 +23,7 @@ defaults option httplog option abortonclose option httpclose - option forwardfor + option forwardfor retries 3 option redispatch @@ -48,7 +48,15 @@ listen stat-auth stats uri /stats stats auth admin:admin -listen http-webservices +listen stat-https + + bind 0.0.0.0:14570 ssl crt /usr/local/etc/haproxy/server.pem ca-file /usr/local/etc/haproxy/ca.crt verify required + + mode http + stats enable + stats uri /stats + +listen http-webservices bind 0.0.0.0:8888 server log1 127.0.0.1:8889 check diff --git a/metricbeat/module/haproxy/docker-compose.yml b/metricbeat/module/haproxy/docker-compose.yml index 606cdc0bab8..e55b2186ec0 100644 --- a/metricbeat/module/haproxy/docker-compose.yml +++ b/metricbeat/module/haproxy/docker-compose.yml @@ -2,8 +2,8 @@ version: '2.3' services: haproxy: - image: docker.elastic.co/integrations-ci/beats-haproxy:${HAPROXY_VERSION:-1.8.22}-1 - build: + image: docker.elastic.co/integrations-ci/beats-haproxy:${HAPROXY_VERSION:-1.8.22}-2 + build: context: ./_meta args: HAPROXY_VERSION: ${HAPROXY_VERSION:-1.8.22} @@ -11,3 +11,4 @@ services: - 14567 - 14568 - 14569 + - 14570 diff --git a/metricbeat/module/haproxy/fields.go b/metricbeat/module/haproxy/fields.go index 92f7291881b..1bee67c5905 100644 --- a/metricbeat/module/haproxy/fields.go +++ b/metricbeat/module/haproxy/fields.go @@ -32,5 +32,5 @@ func init() { // AssetHaproxy returns asset data. // This is the base64 encoded gzipped contents of ../metricbeat/module/haproxy. func AssetHaproxy() string { - return "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" + return "eJzsXFtv27jyf++nGORlnYXjXjbbAgFaoE13/1s0TYLEwT78cWDQ0jgiQpFakorj/fQHJHWzTF0cW04fjl7aWNLMjzPDuXHsE3jA1RlEJJHiafUKQFPN8AyO/vp8bT45egUQogokTTQV/Aw+vQIAyO7CDxGmDF8BqEhIPQsEX9D7M1gQpsynEhkShWdwT8wzqDXl9+oM/v9IKXY0hqNI6+ToP68AFhRZqM4s8RPgJMYqKHPpVWIISZEm2SceXFVsMWpJAzXJblQ5VLlQvhDFhz42LazM9X/IURJm6ciYmEeAzEWqCyCJFAEqhQUUc62LJr/qIKtACzJrd3PETPD72o0W0Oa6TOM5ShALH8A2BDOexnvCcO0oArdYutjT0MuWMErqQkmIjgrAk803Y3oviUOlZYrPQ/3tawdimfLZPylu0N9WXF7imqiHXW3BSzhNNI1xojDYk5bPUymR64wwUA4KA8HDLnuLMRZyNYnJ02S+0v0N323EM/C91AH1B3micRoDiUXKtdkcDgSkitxb6JYojHSE8MsPjGPyNPvx5Rd4JCxFCAR/RKkxBC3ck8cda0wZjame8T2JOsfPi80tEuSwoAyVkQsY3Pm2aEcWiDiRqPxSrzvIFmh15XhcXJXtPKlzbOfan3Mbd1iLCN7bLUrZHkfJTaT6kOwk0TizNjck19KGOMfAPHpgKzLLfGEzsh7hkKodXKt1hjF5GppdYUguhDSqtIFVh7eESnAqTbXJMVbxaKEJGwDN1NDdEotSbDK8fG5vL56Ba1g5PQ+T32x3RZRH3u0xDYtnOywRkeFsf4D8WTH+k6LSymsce8lglQgeUCuPpvdCvljAQPQTmjQku1sETHd1xclUYb00KrlRrvEe5Q6RMmezkNgcjvfHps1wd+NSWBYq9dxs5hkpzKQpidi35CyzpgRiEGbD6MqvNOX3Mj+rwg6oroMpq4+PEFwjb3ZHfdL2Z+bqD7iataqvz3L7L9nLuiub3jfjzJXNJKYKJ0nQXjqogDAMZwsmSNODedslQRn4c9H+QItuAAke/mcTe2Bs8sFzwfmNrzAuqiwSRBjOmBAPaUsbpkcO2M5iFlNPI/t5DNpd/7+MzmcxxjPbv9s1p9oyIBwqeA+f9tCQ+VxEp2todwkNCAoHpdfobX0yc6uJVhAIxjDQGJoAE+/jUMafY2iiU3/S/oCrpZB1H9ZRwt1aejC6ux7D16u/L8dweXXxZQw/Pn+7nI5BSPe/0SMlx5PJpKvNvER6H/nVt32T2RXfjiSMFkLmblodW2QK5SPKtQfcR53d8FAsuabxrucl60BzojAqTx6OJ/BnBfcYdERV1sSnynbJG7BA0UZfRoJhTmIMXGj7sUpjEIs1EsUrmRh6dN4FR65nZuFeWfi3ddc5TE7XEoHRm495zjWGtx+Lhbz76GBaXf720RXTrxlVGjnKLhXmh4Q/32EdjN5YRSyoVBooV5rwAMfwFpyFGsMYA+EhKAGCdy3UCIkGODN/7XHfO6qWB4z+vLm6nP5x+dXhLpT15fP59/zTQm1CAuEr92K55XrrjfKDHbJ9sUdolHcgEqk+MCTDsR0TI0rPgojwhmTiWfuyPInPvBMoygO0HsMwhLvrk08mCBgdm39PPt1dg5aEK2podmDWkRRaHzCA51feOs4B5FTIfd0jwjJCDoqJpdJEbpYOVAEJNH1Ea+Zc5J56Ub5jnqHcPdW5c11GsJcGZH65WFOeuxq/r4AUCySq4DsGpDpCaYXAcblBKyvNlF2tFY3Ek5CqhOggovzeBa8smGSxy2YpIDERUtsAtkHViLuOr6qCCsIui5LG6YSTBh+/vfC+fc1Dph35eZ1BogvHivJ7o17kZM46wT3jzLE1w4MDHPucp3HKiDHdioa269xL1JK2NHOfD+5yw6ZLZKDFuo1nMPocodEYJ+TRB2pXxJ8fURonk+GEfOwkViAM0MKxvn3z7rRs57fbVfbY/o0qRD6M4m6yhWUcYI4BSRVmgSaVVK+MiAKUrRbmrl+tz5meXzt3Q1WVHIHYuCYMQQfJSSYpQ1sb/y9ThpNWsn9Npx10I61LwiZ2EJnQOulGEdshrPAAp6SOUWlSvipjw1Nne95LWCwKYjnxJdWRSHW574hS9J732nSZIIY9cnTBWSxqYu8BD6UUcqe+UPtWyBhM4FbEWIQcoRSdMwRrdgqIxI4+nTFbJJKtQKOMKXdTn7a/YAgGjCLXY5jjQkiXxuWWGxFj3ybXae6Q/goSSeig1ok2vuJuW0/XPFFUPBYwoTBsDpXlC49EUpEqmJPSquugmvd2vmwTGdyObU4uYM3X5tnOgSJaFWiVuY1vXNhsze02u6W9VDvysY7cy09ySR0MsiQrK/Yewiu1OhlsP5USLIxCR0QD8kCkXKM0mHlmw1quTAanhZdUEaTLTKKn23SdFi9Re1sTbVNswlhOrFRSwlJlC+ZKMuPEBVz4NxBRSgSU6MwHA4GESE2DlJGi6TVSaRABcQBzphF5NALgfgG4mqWrRQYDTbeV10sNtdWv0rZsWlAYWIJ5l6aWxSEjiXFn7qbfGw03s1a/Nkdwm5bx4nNmTRAlBkgfvZ66ITVWieCq//lK79z4IA7MgS9yg2mlFcwDloZY998h0cTvdiThaoFSAZkLOwc+X1X9/Cj7TsvE+KZJ5uyyR4/9husyFRuAMvfUnZ/8CktJdb4iMGVaEayz4SgYLQX/RcPcVEnGY4f1loyBeNxAfkEoSyUCSRJmffuCMm2WrUWW7tQM4qcoBwtN96sH837x9Py6j1PuKOO2PoirXjcZ8n6l3EZJ5aXZXWaZ4sq2oI6ERQdBhMGDPcE96jNLqLUvDh1yBvvt09DePnOcuXpsXvD26QkCEbYVplWQ714E5LvtQP72IiB/2w7k6YuAPN0O5O8vAvL37UDagPMCMF2gM0AVjBIptAgEc3HM54O92ci2M5q9k5Hh2kdlNpLxKI4AXnx+nFcOp3pDah9N3KHNZr9gnEqb7Fs0jtVQNdN+SqItprT6VEW5HrYviFrX0f31ob2so6JCy9FkpxyXvlX1BL7HIbltqrr+oL1eyuZSvX3UfgbSvENK0DGw0FNI2cBS1lO1ZhghYTpyK53AFTe5Zmdn9e7yu8P8CVL+wMWyqTf57fJb/iDlVFPC6L+0MSbdXp1//+PmxjydFUA2qDQ8fXF69T2jbdFDQpTZUMbfkBVKOB0DF5AmRu/2EwUalTalUHZK2Uh5enU3tZQdpbcnpx1d24vT86tLqL1S6VolUswZxmNbrOATiRPW5I/K6+i8JCBxkSoMj2CkgwSk0sc26b8UIEWq0RR1kVD6CEY0iBN/TQhw8b5DZu8bX6yJ5D2Mbm8vjrvE8v7m9hrWXqP8kTAaloXeCaznEE2kPnRA/9Dy4nn1ReMB7EwGYWy1SWZNR3D65tRmPZ3KCqkyNnUi+Mnpm9NGLDUxfoCRSbFe3/6YXncK80NNmB92EObt9Had1HqLZV0INgus5sTN6ZcImyP483OKCwvy95MPlsEY6ALII6HMSLxP2Z+62bQBkE3LNoVtrlMNWogHsx8XlFMVNbjaHqW5fXxiXh0mGkxdEyhlujki9Ia5IHSIHmiZURkGGDpYfdJbco9ct0tvj9+ds+CGLTrswp2RZbJYRpRhfTwoTfpsCH/I3h/aYhqunIDzH7RXx3m9NCsnciWpvIe5Nt4LczSx3axtbEqJyKbbxJ+b1KaAq7St5yNBlB90deSI7ng1axB7k8UdBw5Doklz17p+vNtVd5sl7ZrSuqt3Tb4xgtYlmh7igWwOF6WdGk45/ceeBSgaIhA3otanI+zX254A9tVhfqJaPdXwN4Szw47QhJy1c4o8fGfHyX1Wbo80h1547UzX+S8isZgVjZFwe/JsbugIV+aul6iLNCs7/R0Qnp+AeUYemCAhzAkjPGjcv1D7Bpu3t3AYUTj2LV888Due7Ld/NpK8oSvUhil06AogbaPfLeiq18axc5azuh98WrhZEOsVC+H0UH/TEDv0sIDBF4WxHcgp3P02C5uvXHXzE+jLLcaafI7KrscuuVwUjM6v715/+dv1nXrNWeSO7+XXWGuW28UuUZZK65yLrv6Y4jr+AbfzQMHvzoVku6Tmn+GrIvF8Swf2U+q47xMa+n29a/NPAg6niT3/tkP1qnR07cqyvu4oJk/27+PaZEH2HQ4d2bH+RWN2XoyR5oRMKv8GRnlU56L/Tu6cLthJAqbaJdmQgUP67Ilzz3/+GwAA//9AvqeT" } diff --git a/metricbeat/module/haproxy/haproxy.go b/metricbeat/module/haproxy/haproxy.go index 8a7089f1323..b10fd522ee3 100644 --- a/metricbeat/module/haproxy/haproxy.go +++ b/metricbeat/module/haproxy/haproxy.go @@ -23,15 +23,16 @@ import ( "io" "io/ioutil" "net" - "net/http" "net/url" "strings" - "github.com/elastic/beats/metricbeat/mb/parse" - "github.com/gocarina/gocsv" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" + + "github.com/elastic/beats/metricbeat/helper" + "github.com/elastic/beats/metricbeat/mb" + "github.com/elastic/beats/metricbeat/mb/parse" ) // HostParser is used for parsing the configured HAProxy hosts. @@ -167,7 +168,7 @@ type Client struct { } // NewHaproxyClient returns a new instance of HaproxyClient -func NewHaproxyClient(address string) (*Client, error) { +func NewHaproxyClient(address string, base mb.BaseMetricSet) (*Client, error) { u, err := url.Parse(address) if err != nil { return nil, errors.Wrap(err, "invalid url") @@ -179,7 +180,11 @@ func NewHaproxyClient(address string) (*Client, error) { case "unix": return &Client{&unixProto{Network: u.Scheme, Address: u.Path}}, nil case "http", "https": - return &Client{&httpProto{URL: u}}, nil + http, err := helper.NewHTTP(base) + if err != nil { + return nil, err + } + return &Client{&httpProto{HTTP: http}}, nil default: return nil, errors.Errorf("invalid protocol scheme: %s", u.Scheme) } @@ -286,44 +291,20 @@ func (p *unixProto) Info() (*bytes.Buffer, error) { } type httpProto struct { - URL *url.URL + HTTP *helper.HTTP } func (p *httpProto) Stat() (*bytes.Buffer, error) { - url := p.URL.String() // Force csv format - if !strings.HasSuffix(url, ";csv") { - url += ";csv" + if !strings.HasSuffix(p.HTTP.GetURI(), ";csv") { + p.HTTP.SetURI(p.HTTP.GetURI() + ";csv") } - req, err := http.NewRequest("GET", url, nil) + b, err := p.HTTP.FetchContent() if err != nil { return nil, err } - - if p.URL.User != nil { - password, _ := p.URL.User.Password() - req.SetBasicAuth(p.URL.User.Username(), password) - } - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, errors.Errorf("couldn't connect: %v", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, errors.Errorf("invalid response: %s", resp.Status) - } - - d, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, errors.Errorf("couldn't read response body: %v", err) - } - if len(d) == 0 { - return nil, errors.New("got empty response from HAProxy") - } - return bytes.NewBuffer(d), nil + return bytes.NewBuffer(b), nil } func (p *httpProto) Info() (*bytes.Buffer, error) { diff --git a/metricbeat/module/haproxy/info/info.go b/metricbeat/module/haproxy/info/info.go index 4a361efb204..4e873b1a6e6 100644 --- a/metricbeat/module/haproxy/info/info.go +++ b/metricbeat/module/haproxy/info/info.go @@ -18,11 +18,12 @@ package info import ( + "github.com/pkg/errors" + "github.com/elastic/beats/libbeat/logp" + "github.com/elastic/beats/metricbeat/helper" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/module/haproxy" - - "github.com/pkg/errors" ) const ( @@ -44,6 +45,7 @@ func init() { // MetricSet for haproxy info. type MetricSet struct { mb.BaseMetricSet + *helper.HTTP } // New creates a haproxy info MetricSet. @@ -53,8 +55,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // Fetch fetches info stats from the haproxy service. func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { - - hapc, err := haproxy.NewHaproxyClient(m.HostData().URI) + hapc, err := haproxy.NewHaproxyClient(m.HostData().URI, m.BaseMetricSet) if err != nil { return errors.Wrap(err, "failed creating haproxy client") } diff --git a/metricbeat/module/haproxy/stat/stat.go b/metricbeat/module/haproxy/stat/stat.go index 8e39bd6148d..15f6b61b27a 100644 --- a/metricbeat/module/haproxy/stat/stat.go +++ b/metricbeat/module/haproxy/stat/stat.go @@ -18,11 +18,11 @@ package stat import ( + "github.com/pkg/errors" + "github.com/elastic/beats/libbeat/logp" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/module/haproxy" - - "github.com/pkg/errors" ) const ( @@ -53,7 +53,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // Fetch methods returns a list of stats metrics. func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { - hapc, err := haproxy.NewHaproxyClient(m.HostData().URI) + hapc, err := haproxy.NewHaproxyClient(m.HostData().URI, m.BaseMetricSet) if err != nil { return errors.Wrap(err, "failed creating haproxy client") } diff --git a/metricbeat/module/haproxy/test_haproxy.py b/metricbeat/module/haproxy/test_haproxy.py index f175d43d2c5..40ab58f847f 100644 --- a/metricbeat/module/haproxy/test_haproxy.py +++ b/metricbeat/module/haproxy/test_haproxy.py @@ -46,7 +46,7 @@ def _test_stat(self): proc = self.start_beat() self.wait_until(lambda: self.output_lines() > 0) proc.check_kill_and_wait() - self.assert_no_logged_warnings() + self.assert_no_logged_warnings(replace=['SSL/TLS verifications disabled.']) output = self.read_output_json() self.assertGreater(len(output), 0) @@ -82,6 +82,27 @@ def test_stat_http(self): }]) self._test_stat() + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") + def test_stat_https(self): + """ + haproxy stat https metricset test + """ + self.render_config_template(modules=[{ + "name": "haproxy", + "metricsets": ["stat"], + "hosts": ["https://%s/stats" % (self.compose_host(port="14570/tcp"))], + "period": "5s", + "extras": { + "ssl.certificate_authorities": [os.path.join(os.path.dirname(__file__), '_meta/certs/ca.pem')], + "ssl.certificate": os.path.join(os.path.dirname(__file__), '_meta/certs/client.pem'), + "ssl.key": os.path.join(os.path.dirname(__file__), '_meta/certs/client.key'), + # TODO: verification_mode: "certificate" + # compose uses dynamic IP addresses and there are no IP SAN records in the certificate + "ssl.verification_mode": "none" + } + }]) + self._test_stat() + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") def test_stat_http_auth(self): """