Commit bf53b2e6 authored by anuj's avatar anuj
Browse files

Issue #SB-1905 fix: health check api

parent 21c1b606
master dependabot/npm_and_yarn/src/async-2.6.4 dependabot/npm_and_yarn/src/decode-uri-component-0.2.2 dependabot/npm_and_yarn/src/flat-and-mocha-5.0.2 dependabot/npm_and_yarn/src/handlebars-4.7.7 dependabot/npm_and_yarn/src/jsonwebtoken-9.0.0 dependabot/npm_and_yarn/src/lodash-4.17.21 dependabot/npm_and_yarn/src/minimist-and-project-sunbird/telemetry-sdk-and-handlebars-and-mkdirp-1.2.8 release-3.6.0 release-4.3.0 release-4.8.0 release-5.2.0 release-5.3.0 release-5.6.0 release-6.0.0 v1.13.3 v1.13 v1.12 v1.11.1 v1.11 v1.10.1 v1.10 v1.9 v1.8.2 v1.8 v1.7.1 v1.7 v1.6 v1.5.1 v1.5 tmp-testPR tmp-sunbird-bootcamp tmp-rjshrjndrn-patch-1 tmp-revert-118-testPR tmp-revert-110-logs tmp-revert-99-revert-98-revert-97-revert-96-rjshrjndrn-patch-1 tmp-revert-98-revert-97-revert-96-rjshrjndrn-patch-1 tmp-revert-97-revert-96-rjshrjndrn-patch-1 tmp-revert-96-rjshrjndrn-patch-1 tmp-release-sonarcloud tmp-release-2.6.0 tmp-release-2.3.0 tmp-release-2.1.1 tmp-release-2.1.0 tmp-release-2.1.0_pluginSearch tmp-release-2.0.0 tmp-release-1.15 tmp-release-1.14.3 tmp-release-1.14 tmp-release-1.14-sp3 tmp-release-1.8.3 tmp-refactored-dev-deploy tmp-master tmp-loadtest tmp-load-testing tmp-jenkins-test tmp-jenkins-pipeline tmp-final-variable-refac tmp-dial-assemble-api tmp-content-update-read tmp-circleci release-5.6.0_RC1 release-5.2.0_RC1 release-4.8.5_RC1 release-4.8.0_RC2 release-4.8.0_RC1 release-4.3.0_RC1 release-3.8.0_RC3 release-3.8.0_RC2 release-3.8.0_RC1 release-3.7.0_RC2 release-3.7.0_RC1 release-3.6.0_RC1 release-3.2.0_RC2 release-3.2.0_RC1 release-3.1.0 release-3.1.0_RC2 release-3.1.0_RC1 release-3.0.1_RC1 release-3.0.0 release-3.0.0_RC1 release-2.10.0 release-2.10.0_RC2 release-2.10.0_RC1 release-2.9.0_RC3 release-2.9.0_RC2 release-2.9.0_RC1 release-2.8.0 release-2.8.0_RC4 release-2.8.0_RC3 release-2.8.0_RC2 release-2.8.0_RC1 release-2.7.0 release-2.7.0_RC2 release-2.7.0_RC1 release-2.6.0 release-2.6.0_RC4 release-2.6.0_RC3 release-2.6.0_RC2 release-2.6.0_RC1 release-2.3.0 release-2.3.0_RC2 release-2.3.0_RC1 release-2.1.1_RC1 release-2.1.0_RC2 release-2.1.0_RC1 release-2.0.0 release-2.0.0_RC5 release-2.0.0_RC4 release-2.0.0_RC3 release-2.0.0_RC2 release-2.0.0_RC1 release-1.15.0 release-1.15_RC7 release-1.15_RC6 release-1.15_RC5 release-1.15_RC4 release-1.15_RC3 release-1.15_RC2 release-1.15_RC1 release-1.14.0
No related merge requests found
Showing with 109 additions and 68 deletions
+109 -68
......@@ -25,10 +25,15 @@ const contentProviderApiKey = process.env.sunbird_content_provider_api_key
const learnerServiceApiKey = process.env.sunbird_learner_service_api_key
const learnerServiceBaseUrl = process.env.sunbird_learner_service_base_url ? process.env.sunbird_learner_service_base_url : 'https://dev.open-sunbird.org/api'
const learnerServiceLocalBaseUrl = process.env.sunbird_learner_service_local_base_url
? process.env.sunbird_learner_service_local_base_url
: 'http://learner-service:9000'
configUtil.setContentProviderApi(contentProviderApiConfig.API)
configUtil.setConfig('BASE_URL', contentProviderBaseUrl)
configUtil.setConfig('Authorization_TOKEN', 'Bearer ' + contentProviderApiKey)
configUtil.setConfig('LEARNER_SERVICE_BASE_URL', learnerServiceBaseUrl)
configUtil.setConfig('LEARNER_SERVICE_LOCAL_BASE_URL', learnerServiceLocalBaseUrl)
configUtil.setConfig('LEARNER_SERVICE_AUTHORIZATION_TOKEN', 'Bearer ' + learnerServiceApiKey)
configUtil.setConfig('DIALCODE_GENERATE_MAX_COUNT', 20000)
configUtil.setConfig('CONTENT_UPLOAD_REQ_LIMIT', reqDataLimitOfContentUpload)
......
Subproject commit 558c7d68d3839eea2058ee7423af7f00d3aa6b34
Subproject commit 3552f5411e6b5984a66efcc43e84d988d7ef6126
......@@ -19,12 +19,13 @@ var contentModel = require('../models/contentModel').CONTENT
var messageUtils = require('./messageUtil')
var utilsService = require('../service/utilsService')
var emailService = require('./emailService')
var cassandraUtils = require('../utils/cassandraUtil')
var filename = path.basename(__filename)
var contentMessage = messageUtils.CONTENT
var compositeMessage = messageUtils.COMPOSITE
var responseCode = messageUtils.RESPONSE_CODE
// var hcMessages = messageUtils.HEALTH_CHECK
var hcMessages = messageUtils.HEALTH_CHECK
var reqMsg = messageUtils.REQUEST
/**
......@@ -52,71 +53,87 @@ function getContentTypeForContent () {
}
// Function help to check health api
// function getChecksObj (name, healthy, err, errMsg) {
// return {
// name: name,
// healthy: healthy,
// err: err,
// errmsg: errMsg
// }
// };
function getChecksObj (name, healthy, err, errMsg) {
return {
name: name,
healthy: healthy,
err: err,
errmsg: errMsg
}
};
// Function help to check health api
// function getHealthCheckResp (rsp, healthy, checksArrayObj) {
// delete rsp.responseCode
// rsp.result = {}
// rsp.result.name = messageUtils.SERVICE.NAME
// rsp.result.version = messageUtils.API_VERSION.V1
// rsp.result.healthy = healthy
// rsp.result.check = checksArrayObj
// return rsp
// }
function getHealthCheckResp (rsp, healthy, checksArrayObj) {
delete rsp.responseCode
rsp.result = {}
rsp.result.name = messageUtils.SERVICE.NAME
rsp.result.version = messageUtils.API_VERSION.V1
rsp.result.healthy = healthy
rsp.result.check = checksArrayObj
return rsp
}
function checkHealth (req, response) {
return response.status(200).send('ok')
// var rspObj = req.rspObj;
// var checksArrayObj = [];
// var isEkStepHealthy, isLSHealthy, isDbConnected;
// var csApiStart = Date.now();
// async.parallel([
// function(CB) {
// var apiCallStart = Date.now();
// contentProvider.ekStepHealthCheck(function(err, res) {
// if(res && res.result && res.result.healthy) {
// isEkStepHealthy = true;
// checksArrayObj.push(getChecksObj(hcMessages.EK_STEP.NAME, isEkStepHealthy, "", ""));
// } else {
// isEkStepHealthy = false;
// checksArrayObj.push(getChecksObj(hcMessages.EK_STEP.NAME, isEkStepHealthy,
// hcMessages.EK_STEP.FAILED_CODE, hcMessages.EK_STEP.FAILED_MESSAGE));
// }
// CB();
// })
// },
// function(CB) {
// var apiCallStart = Date.now();
// contentProvider.learnerServiceHealthCheck(function(err, res) {
// if(res && res.result && res.result.healthy) {
// isLSHealthy = true;
// checksArrayObj.push(getChecksObj(hcMessages.LEARNER_SERVICE.NAME, isLSHealthy, "", ""));
// } else {
// isLSHealthy = false;
// checksArrayObj.push(getChecksObj(hcMessages.LEARNER_SERVICE.NAME,
// isLSHealthy, hcMessages.LEARNER_SERVICE.FAILED_CODE,
// hcMessages.LEARNER_SERVICE.FAILED_MESSAGE));
// }
// CB();
// })
// }
// ], function() {
// if(isEkStepHealthy && isLSHealthy && isDbConnected) {
// var rsp = respUtil.successResponse(rspObj);
// return response.status(200).send(getHealthCheckResp(rsp, true, checksArrayObj));
// } else {
// var rsp = respUtil.successResponse(rspObj);
// return response.status(500).send(getHealthCheckResp(rsp, false, checksArrayObj));
// }
// });
var rspObj = req.rspObj
var checksArrayObj = []
var isEkStepHealthy
var isLSHealthy
var isDbConnected
async.parallel([
function (CB) {
var cassandraStatus = cassandraUtils.getCassandraStatus()
if (cassandraStatus) {
isDbConnected = true
checksArrayObj.push(getChecksObj(hcMessages.CASSANDRA_DB.NAME, isDbConnected, '', ''))
} else {
isDbConnected = false
checksArrayObj.push(getChecksObj(hcMessages.CASSANDRA_DB.NAME, isDbConnected,
hcMessages.CASSANDRA_DB.FAILED_CODE, hcMessages.CASSANDRA_DB.FAILED_MESSAGE))
}
CB()
},
function (CB) {
contentProvider.ekStepHealthCheck(function (err, res) {
if (err) {
isEkStepHealthy = false
checksArrayObj.push(getChecksObj(hcMessages.EK_STEP.NAME, isEkStepHealthy,
hcMessages.EK_STEP.FAILED_CODE, hcMessages.EK_STEP.FAILED_MESSAGE))
} else if (res && res.result && res.result.healthy) {
isEkStepHealthy = true
checksArrayObj.push(getChecksObj(hcMessages.EK_STEP.NAME, isEkStepHealthy, '', ''))
} else {
isEkStepHealthy = false
checksArrayObj.push(getChecksObj(hcMessages.EK_STEP.NAME, isEkStepHealthy,
hcMessages.EK_STEP.FAILED_CODE, hcMessages.EK_STEP.FAILED_MESSAGE))
}
CB()
})
},
function (CB) {
contentProvider.learnerServiceHealthCheck(function (err, res) {
if (err) {
isLSHealthy = false
checksArrayObj.push(getChecksObj(hcMessages.LEARNER_SERVICE.NAME,
isLSHealthy, hcMessages.LEARNER_SERVICE.FAILED_CODE, hcMessages.LEARNER_SERVICE.FAILED_MESSAGE))
} else if (res && res.result && res.result.response && res.result.response.healthy) {
isLSHealthy = true
checksArrayObj.push(getChecksObj(hcMessages.LEARNER_SERVICE.NAME, isLSHealthy, '', ''))
} else {
isLSHealthy = false
checksArrayObj.push(getChecksObj(hcMessages.LEARNER_SERVICE.NAME,
isLSHealthy, hcMessages.LEARNER_SERVICE.FAILED_CODE, hcMessages.LEARNER_SERVICE.FAILED_MESSAGE))
}
CB()
})
}
], function () {
var rsp = respUtil.successResponse(rspObj)
if (isEkStepHealthy && isLSHealthy && isDbConnected) {
return response.status(200).send(getHealthCheckResp(rsp, true, checksArrayObj))
} else {
return response.status(500).send(getHealthCheckResp(rsp, false, checksArrayObj))
}
})
}
function searchAPI (req, response) {
......@@ -410,7 +427,7 @@ function uploadContentAPI (req, response) {
])
})
} else {
var queryString = {fileUrl: data.queryParams.fileUrl}
var queryString = { fileUrl: data.queryParams.fileUrl }
async.waterfall([
function (CBW) {
......@@ -726,7 +743,7 @@ function retireContentAPI (req, response) {
errMsg = res && res.params ? res.params.errmsg : contentMessage.GET_MY.FAILED_MESSAGE
respCode = res && res.responseCode ? res.responseCode : responseCode.SERVER_ERROR
httpStatus = res && res.statusCode >= 100 && res.statusCode < 600 ? res.statusCode : 500
failedContent.push({contentId: contentId, errCode: errCode, errMsg: errMsg})
failedContent.push({ contentId: contentId, errCode: errCode, errMsg: errMsg })
}
CBE(null, null)
})
......
......@@ -406,13 +406,18 @@ exports.EMAIL = {
exports.HEALTH_CHECK = {
EK_STEP: {
NAME: 'ekstep.api',
FAILED_CODE: 'EK_STEP_HEALTH_FAILED',
FAILED_MESSAGE: 'Ekstep service is not healthy'
FAILED_CODE: 'CONTENT_PROVIDER_HEALTH_FAILED',
FAILED_MESSAGE: 'Content provider service is not healthy'
},
LEARNER_SERVICE: {
NAME: 'learnerservice.api',
FAILED_CODE: 'LEARNER_SERVICE_HEALTH_FAILED',
FAILED_MESSAGE: 'Learner service is not healthy'
},
CASSANDRA_DB: {
NAME: 'cassandra.db',
FAILED_CODE: 'CASSANDRA_HEALTH_FAILED',
FAILED_MESSAGE: 'Cassandra db is not connected'
}
}
......
......@@ -15,7 +15,12 @@ function getAppIDForRESP (path) {
var arr = path.split(':')[0].split('/').filter(function (n) {
return n !== ''
})
var appId = 'api.' + arr[arr.length - 2] + '.' + arr[arr.length - 1]
var appId
if (arr.length === 1) {
appId = 'api.' + arr[arr.length - 1]
} else {
appId = 'api.' + arr[arr.length - 2] + '.' + arr[arr.length - 1]
}
return appId
}
......
......@@ -3,6 +3,8 @@ var LOG = require('sb_logger_util')
var path = require('path')
var filename = path.basename(__filename)
var contactPoints = process.env.sunbird_cassandra_ips.split(',')
var isCassandraConnected = false
models.setDirectory(path.join(__dirname, '.', '..', 'models', 'cassandra')).bind(
{
clientOptions: {
......@@ -21,12 +23,19 @@ models.setDirectory(path.join(__dirname, '.', '..', 'models', 'cassandra')).bind
},
function (err) {
if (err) {
isCassandraConnected = false
LOG.error({filename, 'Error connecting to the database: ': err})
throw err
} else {
isCassandraConnected = true
LOG.info({filename, 'connecting to database': 'success'})
}
}
)
function getCassandraStatus () {
return isCassandraConnected
}
module.exports = models
module.exports.getCassandraStatus = getCassandraStatus
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment