{"id":23890,"date":"2021-09-26T17:40:52","date_gmt":"2021-09-26T17:40:52","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=23890"},"modified":"2022-11-28T16:05:26","modified_gmt":"2022-11-28T16:05:26","slug":"install-and-configure-prometheus-mysql-exporter","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/install-and-configure-prometheus-mysql-exporter\/","title":{"rendered":"Install and Configure Prometheus MySQL Exporter"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Step 1 &#8211; Add Prometheus system user and group:<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$ sudo groupadd --system prometheus\n$ sudo useradd -s \/sbin\/nologin --system -g prometheus prometheus\n\n<span class=\"hljs-comment\"># This user will manage the exporter service.<\/span>\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 2 &#8211; Download and install Prometheus MySQL Exporter<\/h2>\n\n\n\n<p>This should be done on MySQL \/ MariaDB servers, both slaves and master servers. You may need to check Prometheus MySQL exporter releases page for the latest release, then export the latest version.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>https:\/\/github.com\/prometheus\/mysqld_exporter\/releases<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$ curl -s https:<span class=\"hljs-comment\">\/\/api.github.com\/repos\/prometheus\/mysqld_exporter\/releases\/latest   | grep browser_download_url   | grep linux-amd64 | cut -d '\"' -f 4   | wget -qi -<\/span>\n$ tar xvf mysqld_exporter*.tar.gz\n$ sudo mv  mysqld_exporter-*.linux-amd64\/mysqld_exporter \/usr\/local\/bin\/\n$ sudo chmod +x \/usr\/local\/bin\/mysqld_exporter\n\n<span class=\"hljs-comment\"># Confirm installation by checking version of mysqld_exporter<\/span>\n$ mysqld_exporter  --version<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 3 &#8211; Create Prometheus exporter database user<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$ mysql -u root -p\n\nThe user should have PROCESS, SELECT, REPLICATION CLIENT grants:\n\nmysql&gt; CREATE USER <span class=\"hljs-string\">'mysqld_exporter'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> IDENTIFIED BY <span class=\"hljs-string\">'StrongPassword'<\/span>;\nmysql&gt; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO <span class=\"hljs-string\">'mysqld_exporter'<\/span>@<span class=\"hljs-string\">'localhost'<\/span>;\nmysql&gt; FLUSH PRIVILEGES;\nmysql&gt; <span class=\"hljs-keyword\">EXIT<\/span>\n\n<span class=\"hljs-comment\"># If you have a Master-Slave database architecture, create user on the master servers only.<\/span>\n<span class=\"hljs-comment\"># WITH MAX_USER_CONNECTIONS 2 is used to set a max connection limit for the user to avoid overloading the server with monitoring scrapes under heavy load.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4 &#8211; Configure database credentials<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Create database credentials file:<\/span>\n$ sudo vim \/etc\/.mysqld_exporter.cnf\n\n<span class=\"hljs-comment\"># Add correct username and password for user create<\/span>\n\n&#91;client]\nuser=mysqld_exporter\npassword=StrongPassword\n\n<span class=\"hljs-comment\"># Set ownership permissions:<\/span>\n$ sudo chown root:prometheus \/etc\/.mysqld_exporter.cnf<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 5 &#8211; Create systemd unit file ( For Systemd systems )<\/h2>\n\n\n\n<p>This is for systemd servers, for SysV init system, use Prometheus MySQL exporter init script for SysV init system<\/p>\n\n\n\n<p>Create a new service file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sudo vi \/etc\/systemd\/system\/mysql_exporter.service\n\nAdd the following content\n\n&#91;Unit]\nDescription=Prometheus MySQL Exporter\nAfter=network.target\nUser=prometheus\nGroup=prometheus\n\n&#91;Service]\nType=simple\nRestart=always\nExecStart=<span class=\"hljs-regexp\">\/usr\/<\/span>local\/bin\/mysqld_exporter \\\n--config.my-cnf \/etc\/.mysqld_exporter.cnf \\\n--collect.global_status \\\n--collect.info_schema.innodb_metrics \\\n--collect.auto_increment.columns \\\n--collect.info_schema.processlist \\\n--collect.binlog_size \\\n--collect.info_schema.tablestats \\\n--collect.global_variables \\\n--collect.info_schema.query_response_time \\\n--collect.info_schema.userstats \\\n--collect.info_schema.tables \\\n--collect.perf_schema.tablelocks \\\n--collect.perf_schema.file_events \\\n--collect.perf_schema.eventswaits \\\n--collect.perf_schema.indexiowaits \\\n--collect.perf_schema.tableiowaits \\\n--collect.slave_status \\\n--web.listen-address=<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>:<span class=\"hljs-number\">9104<\/span>\n\n&#91;Install]\nWantedBy=multi-user.target\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If your server has a public and private network, you may need to replace 0.0.0.0:9104 with private IP, e.g. 192.168.4.5:9104<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6 &#8211; When done, reload systemd and start mysql_exporter service<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">$ sudo systemctl daemon-reload\n$ sudo systemctl enable mysql_exporter\n$ sudo systemctl start mysql_exporter<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 7 &#8211; Configure MySQL endpoint to be scraped by Prometheus Server<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Login<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">your<\/span> <span class=\"hljs-selector-tag\">Prometheus<\/span> <span class=\"hljs-selector-tag\">server<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">Configure<\/span> <span class=\"hljs-selector-tag\">endpoint<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">scrape<\/span>. <span class=\"hljs-selector-tag\">Below<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">an<\/span> <span class=\"hljs-selector-tag\">example<\/span> <span class=\"hljs-selector-tag\">for<\/span> <span class=\"hljs-selector-tag\">two<\/span> <span class=\"hljs-selector-tag\">MySQL<\/span> <span class=\"hljs-selector-tag\">database<\/span> <span class=\"hljs-selector-tag\">servers<\/span>.\n\n<span class=\"hljs-selector-tag\">scrape_configs<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">job_name<\/span>: <span class=\"hljs-selector-tag\">server1_db<\/span>\n    <span class=\"hljs-selector-tag\">static_configs<\/span>:\n      <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">targets<\/span>: <span class=\"hljs-selector-attr\">&#91;<span class=\"hljs-string\">'10.10.1.10:9104'<\/span>]<\/span>\n        <span class=\"hljs-selector-tag\">labels<\/span>:\n          <span class=\"hljs-selector-tag\">alias<\/span>: <span class=\"hljs-selector-tag\">db1<\/span>\n\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">job_name<\/span>: <span class=\"hljs-selector-tag\">server2_db<\/span>\n    <span class=\"hljs-selector-tag\">static_configs<\/span>:\n      <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">targets<\/span>: <span class=\"hljs-selector-attr\">&#91;<span class=\"hljs-string\">'10.10.1.11:9104'<\/span>]<\/span>\n        <span class=\"hljs-selector-tag\">labels<\/span>:\n          <span class=\"hljs-selector-tag\">alias<\/span>: <span class=\"hljs-selector-tag\">db2<\/span>\n\n<span class=\"hljs-selector-tag\">The<\/span> <span class=\"hljs-selector-tag\">first<\/span> <span class=\"hljs-selector-tag\">server<\/span> <span class=\"hljs-selector-tag\">has<\/span> <span class=\"hljs-selector-tag\">the<\/span> <span class=\"hljs-selector-tag\">IP<\/span> <span class=\"hljs-selector-tag\">address<\/span> 10<span class=\"hljs-selector-class\">.10<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.10<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">the<\/span> <span class=\"hljs-selector-tag\">second<\/span> <span class=\"hljs-selector-tag\">one<\/span> <span class=\"hljs-selector-tag\">is<\/span> 10<span class=\"hljs-selector-class\">.10<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.11<\/span>. <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">other<\/span> <span class=\"hljs-selector-tag\">targets<\/span> <span class=\"hljs-selector-tag\">using<\/span> <span class=\"hljs-selector-tag\">the<\/span> <span class=\"hljs-selector-tag\">similar<\/span> <span class=\"hljs-selector-tag\">format<\/span>. <span class=\"hljs-selector-tag\">Job<\/span> <span class=\"hljs-selector-tag\">names<\/span> <span class=\"hljs-selector-tag\">should<\/span> <span class=\"hljs-selector-tag\">be<\/span> <span class=\"hljs-selector-tag\">unique<\/span> <span class=\"hljs-selector-tag\">for<\/span> <span class=\"hljs-selector-tag\">each<\/span> <span class=\"hljs-selector-tag\">target<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create \/ Import Grafana Dashboard for MySQL Prometheus exporter<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Let\u2019s download MySQL_Overview dashboard which has a good overview of database performance.\n\n$ mkdir ~\/grafana-dashboards\n$ cd ~\/grafana-dashboards\n$ wget https:<span class=\"hljs-comment\">\/\/raw.githubusercontent.com\/percona\/grafana-dashboards\/master\/dashboards\/MySQL_Overview.json<\/span>\n\nUpload Prometheus MySQL dashboard(s) to grafana\nGo to Dashboards &gt; Import &gt; Upload .json file \nLocate the directory with dashboard file <span class=\"hljs-keyword\">and<\/span> import\nMetrics collected should start showing.\n\nYou need to restart Grafana server to import these dashboards.\n\nsudo systemctl restart grafana-server\nsudo service grafana-server restart\nYou can then start using the dashboards on Grafana. I\u2019ll <span class=\"hljs-keyword\">do<\/span> a guide <span class=\"hljs-keyword\">for<\/span> how to Monitor Linux server with Prometheus, <span class=\"hljs-keyword\">for<\/span> OS metrics, before then, check similar guides below:\n\nHow to monitor Linux systems with Grafana, telegraf, <span class=\"hljs-keyword\">and<\/span> InfluxDB.\nMonitor Linux Server Performance with Prometheus <span class=\"hljs-keyword\">and<\/span> Grafana in <span class=\"hljs-number\">5<\/span> minutes\nMonitor Apache Web Server with Prometheus <span class=\"hljs-keyword\">and<\/span> Grafana in <span class=\"hljs-number\">5<\/span> minutes\nYour support is our everlasting motiv<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Ubuntu 18.04 &amp; CentOS 7<\/h2>\n\n\n\n<script src=\"https:\/\/gist.github.com\/devops-school\/02bfe74ac636e4e43009d6bf6b2b8777.js\"><\/script>\n","protected":false},"excerpt":{"rendered":"<p>Step 1 &#8211; Add Prometheus system user and group: Step 2 &#8211; Download and install Prometheus MySQL Exporter This should be done on MySQL \/ MariaDB servers, both slaves and&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-23890","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=23890"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23890\/revisions"}],"predecessor-version":[{"id":32003,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23890\/revisions\/32003"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=23890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=23890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=23890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}