Add health checks to Node.js services (#26)

* Move Node healthchecks to gRPC

* gitignore proto files

* Switch to standard health RPC

* Fix lint

* Update client.js

* Add protos back + update them

* node services: fix & run genproto.sh

this gets currencyservice to work but paymentservice is still crashing
in the docker container.

Signed-off-by: Ahmet Alp Balkan <ahmetb@google.com>

* Fix docker breaking

* update dockerfiles with released health probe

Signed-off-by: Ahmet Alp Balkan <ahmetb@google.com>
This commit is contained in:
Ace Nassri 2018-09-19 12:35:22 -07:00 committed by Ahmet Alp Balkan
parent 360d983512
commit 6c37a96f3a
18 changed files with 313 additions and 109 deletions

View file

@ -16,27 +16,49 @@
require('@google-cloud/profiler').start({
serviceContext: {
service: 'currencyservice',
version: '1.0.0'
service: 'currencyservice',
version: '1.0.0'
}
});
require('@google-cloud/trace-agent').start();
require('@google-cloud/debug-agent').start({
require('@google-cloud/trace-agent').start();
require('@google-cloud/debug-agent').start({
serviceContext: {
service: 'currencyservice',
version: 'VERSION'
}
})
});
const path = require('path');
const grpc = require('grpc');
const request = require('request');
const xml2js = require('xml2js');
const protoLoader = require('@grpc/proto-loader');
const MAIN_PROTO_PATH = path.join(__dirname, './proto/demo.proto');
const HEALTH_PROTO_PATH = path.join(__dirname, './proto/grpc/health/v1/health.proto');
const PROTO_PATH = path.join(__dirname, './proto/demo.proto');
const PORT = 7000;
const DATA_URL = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
const shopProto = grpc.load(PROTO_PATH).hipstershop;
const shopProto = _loadProto(MAIN_PROTO_PATH).hipstershop;
const healthProto = _loadProto(HEALTH_PROTO_PATH).grpc.health.v1;
/**
* Helper function that loads a protobuf file.
*/
function _loadProto (path) {
const packageDefinition = protoLoader.loadSync(
path,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
);
return grpc.loadPackageDefinition(packageDefinition);
}
/**
* Helper function that gets currency data from an XML webpage
@ -116,8 +138,8 @@ function convert (call, callback) {
nanos: euros.nanos * data[request.to_code]
});
result.units = Math.floor(result.units)
result.nanos = Math.floor(result.nanos)
result.units = Math.floor(result.units);
result.nanos = Math.floor(result.nanos);
result.currency_code = request.to_code;
console.log(`conversion request successful`);
@ -130,6 +152,13 @@ function convert (call, callback) {
}
}
/**
* Endpoint for health checks
*/
function check (call, callback) {
callback(null, { status: 'SERVING' });
}
/**
* Starts an RPC server that receives requests for the
* CurrencyConverter service at the sample server port
@ -138,6 +167,7 @@ function main () {
console.log(`Starting gRPC server on port ${PORT}...`);
const server = new grpc.Server();
server.addService(shopProto.CurrencyService.service, {getSupportedCurrencies, convert});
server.addService(healthProto.Health.service, {check});
server.bind(`0.0.0.0:${PORT}`, grpc.ServerCredentials.createInsecure());
server.start();
}