Skip to content
This repository has been archived by the owner on Feb 17, 2022. It is now read-only.

Add MySQL replication status check lambda function #4

Merged
merged 4 commits into from Jun 17, 2019
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Expand Up @@ -2,4 +2,4 @@
.env
node_modules
vendor

node_modules
111 changes: 111 additions & 0 deletions mysql/replcation_lambda/index.js
@@ -0,0 +1,111 @@
const AWS = require('aws-sdk');
const mysql = require('mysql2/promise');
const ssm = new AWS.SSM({ apiVersion: '2014-11-06' });


async function loadSSMParam(name) {
var ssmParams = {
Name: name,
WithDecryption: true
};

return new Promise((resolve, reject) => {
ssm.getParameter(ssmParams, function (err, data) {
if (err) console.log(err);
else resolve(data.Parameter.Value);
});
});
}

function putMetricData(namespace, metricName, value, unit) {
console.log(`LOG|${value}|${unit}|${metricName}|${namespace}`);

callCloudWatch({
MetricData: [{
MetricName: metricName,
Value: value,
Timestamp: new Date(),
Unit: unit,
}],
Namespace: namespace
});
}

function putGroupMetricData(namespace, metricName, dimension, value, unit) {
console.log(`LOG|${value}|${unit}|${dimension}|${metricName}|${namespace}`);

callCloudWatch({
MetricData: [{
MetricName: metricName,
Dimensions: [{
Name: 'Group',
Value: dimension
}],
Value: value,
Timestamp: new Date(),
Unit: unit,
}],
Namespace: namespace
});
}

function callCloudWatch(params) {
let cloudWatch = new AWS.CloudWatch();

cloudWatch.putMetricData(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
}

exports.handler = async (event, context, callback) => {
try {
let namespace = event.cloudwatch_namespace;
let metricName = event.cloudwatch_metric_name;

let password = await loadSSMParam(event.mariadb_password);
let port = event.mariadb_port;
if (!port) {
port = 3306;
}

let dbConn = await mysql.createConnection({
host: event.mariadb_host,
user: event.mariadb_user,
port: port,
password: password,
});
let [rows, fields] = await dbConn.execute('SHOW SLAVE STATUS');
let status = JSON.parse(JSON.stringify(rows))[0];
putMetricData(namespace, metricName, status.Seconds_Behind_Master, 'Seconds');

let ioStatus = 0;
let sqlStatus = 0;
if (status.Slave_IO_Running === 'Yes') {
ioStatus = 1;
}
if (status.Slave_SQL_Running === 'Yes') {
sqlStatus = 1;
}
putGroupMetricData(namespace, metricName, 'Slave_IO_Running', ioStatus, 'Count');
putGroupMetricData(namespace, metricName, 'Slave_SQL_Running', sqlStatus, 'Count');
ssaifriend marked this conversation as resolved.
Show resolved Hide resolved

await dbConn.end();
ssaifriend marked this conversation as resolved.
Show resolved Hide resolved

let response = {
statusCode: 200,
body: '',
};

callback(null, response);
} catch (err) {
console.log(err);

let response = {
statusCode: 500,
body: err,
};

callback(null, response);
}
};
96 changes: 96 additions & 0 deletions mysql/replcation_lambda/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions mysql/replcation_lambda/package.json
@@ -0,0 +1,8 @@
{
"name": "metricReplicationLag",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"mysql2": "^1.6.4"
}
}