Skip to content

Commit

Permalink
Add a specific call to set the status of an instance
Browse files Browse the repository at this point in the history
  • Loading branch information
malaporte committed Nov 14, 2023
1 parent 0961d07 commit ee800fb
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 61 deletions.
3 changes: 2 additions & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export class Eureka {
constructor(config: EurekaClient.EurekaConfig | EurekaClient.EurekaYmlConfig | EurekaClient.EurekaMiddlewareConfig);
start(cb?: (err: Error, ...rest: any[]) => void): void;
stop(cb?: (err: Error, ...rest: any[]) => void): void;
setStatus(status: EurekaClient.InstanceStatus, cb?: (err: Error, ...rest: any[]) => void): void;
getInstancesByAppId(appId: string): EurekaClient.EurekaInstanceConfig[];
getInstancesByVipAddress(vidAddress: string): EurekaClient.EurekaInstanceConfig[];
}
Expand Down Expand Up @@ -47,7 +48,7 @@ export namespace EurekaClient {
secureHealthCheckUrl?: string | undefined;
secureVipAddress?: string | undefined;
countryId?: number | undefined;
status?: InstanceStatus | undefined;
status: InstanceStatus;
overriddenstatus?: InstanceStatus | undefined;
leaseInfo?: LeaseInfo | undefined;
isCoordinatingDiscoveryServer?: boolean | undefined;
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

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

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@coveord/eureka-js-client",
"version": "1.0.2",
"version": "1.1.0",
"description": "A JavaScript implementation the Netflix OSS service registry, Eureka.",
"main": "lib/index.js",
"scripts": {
Expand Down
138 changes: 80 additions & 58 deletions src/EurekaClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,28 @@ export default class Eureka extends EventEmitter {
}
}

setStatus(status, callback = noop) {
this.eurekaRequest({
method: 'PUT',
uri: `${this.config.instance.app}/${this.instanceId}/status?value=${encodeURIComponent(status)}`,
}, (error, response, body) => {
if (!error && response.statusCode === 200) {
this.logger.info(
`updated status in Eureka to '${status}': ${this.config.instance.app}/${this.instanceId}`,
);
this.emit('status');
return callback(null);
} else if (error) {
this.logger.warn('Error updating status with eureka', error);
return callback(error);
} else {
return callback(
new Error(`updating status in Eureka FAILED: status: ${response.statusCode} body: ${body}`),
);
}
});
}

/*
Validates client configuration.
*/
Expand All @@ -200,7 +222,7 @@ export default class Eureka extends EventEmitter {
Registers with the Eureka server and initializes heartbeats on registration success.
*/
register(callback = noop) {
this.config.instance.status = 'UP';
this.config.instance.status = 'STARTING';
const connectionTimeout = setTimeout(() => {
this.logger.warn('It looks like it\'s taking a while to register with ' +
'Eureka. This usually means there is an issue connecting to the host ' +
Expand All @@ -225,7 +247,7 @@ export default class Eureka extends EventEmitter {
return callback(error);
}
return callback(
new Error(`Eureka registration FAILED: status: ${response.statusCode} body: ${body}`)
new Error(`Eureka registration FAILED: status: ${response.statusCode} body: ${JSON.stringify(body)}`)
);
});
}
Expand Down Expand Up @@ -367,9 +389,9 @@ export default class Eureka extends EventEmitter {
});
}

/*
Retrieves all applications registered with the Eureka server
*/
/*
Retrieves all applications registered with the Eureka server
*/
fetchDelta(callback = noop) {
this.eurekaRequest({
uri: 'delta',
Expand Down Expand Up @@ -564,63 +586,63 @@ export default class Eureka extends EventEmitter {
*/
eurekaRequest(opts, callback, retryAttempt = 0) {
waterfall([
/*
Resolve Eureka Clusters
*/
done => {
this.clusterResolver.resolveEurekaUrl((err, eurekaUrl) => {
if (err) return done(err);
const requestOpts = merge({}, opts, {
baseUrl: eurekaUrl,
gzip: true,
/*
Resolve Eureka Clusters
*/
done => {
this.clusterResolver.resolveEurekaUrl((err, eurekaUrl) => {
if (err) return done(err);
const requestOpts = merge({}, opts, {
baseUrl: eurekaUrl,
gzip: true,
});
done(null, requestOpts);
}, retryAttempt);
},
/*
Apply Request Middleware
*/
(requestOpts, done) => {
this.requestMiddleware(requestOpts, (newRequestOpts) => {
if (typeof newRequestOpts !== 'object') {
return done(new Error('requestMiddleware did not return an object'));
}
done(null, newRequestOpts);
});
done(null, requestOpts);
}, retryAttempt);
},
/*
Apply Request Middleware
*/
(requestOpts, done) => {
this.requestMiddleware(requestOpts, (newRequestOpts) => {
if (typeof newRequestOpts !== 'object') {
return done(new Error('requestMiddleware did not return an object'));
}
done(null, newRequestOpts);
});
},
},
/*
Perform Request
*/
(requestOpts, done) => {
const method = requestOpts.method ? requestOpts.method.toLowerCase() : 'get';
request[method](requestOpts, (error, response, body) => {
done(error, response, body, requestOpts);
});
},
],
/*
Perform Request
Handle Final Output.
*/
(requestOpts, done) => {
const method = requestOpts.method ? requestOpts.method.toLowerCase() : 'get';
request[method](requestOpts, (error, response, body) => {
done(error, response, body, requestOpts);
});
},
],
/*
Handle Final Output.
*/
(error, response, body, requestOpts) => {
if (error) this.logger.error('Problem making eureka request', error);

// Perform retry if request failed and we have attempts left
const responseInvalid = response
&& response.statusCode
&& String(response.statusCode)[0] === '5';

if ((error || responseInvalid) && retryAttempt < this.config.eureka.maxRetries) {
const nextRetryDelay = this.config.eureka.requestRetryDelay * (retryAttempt + 1);
this.logger.warn(`Eureka request failed to endpoint ${requestOpts.baseUrl}, ` +
`next server retry in ${nextRetryDelay}ms`);

setTimeout(() => this.eurekaRequest(opts, callback, retryAttempt + 1),
nextRetryDelay);
return;
}
(error, response, body, requestOpts) => {
if (error) this.logger.error('Problem making eureka request', error);

// Perform retry if request failed and we have attempts left
const responseInvalid = response
&& response.statusCode
&& String(response.statusCode)[0] === '5';

if ((error || responseInvalid) && retryAttempt < this.config.eureka.maxRetries) {
const nextRetryDelay = this.config.eureka.requestRetryDelay * (retryAttempt + 1);
this.logger.warn(`Eureka request failed to endpoint ${requestOpts.baseUrl}, ` +
`next server retry in ${nextRetryDelay}ms`);

setTimeout(() => this.eurekaRequest(opts, callback, retryAttempt + 1),
nextRetryDelay);
return;
}

callback(error, response, body);
});
callback(error, response, body);
});
}

}

0 comments on commit ee800fb

Please sign in to comment.