Merge pull request #1317 from balena-io/cache-service-names

Cache service names in local log backend
This commit is contained in:
CameronDiver 2020-05-14 10:29:25 +01:00 committed by GitHub
commit a2f06d5934
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 8 deletions

View File

@ -331,10 +331,18 @@ export function createV2Api(router: Router, applications: ApplicationManager) {
});
router.get('/v2/local/logs', async (_req, res) => {
const serviceNameCache: { [sId: number]: string } = {};
const backend = applications.logger.getLocalBackend();
backend.assignServiceNameResolver(
applications.serviceNameFromId.bind(applications),
);
// Cache the service names to IDs per call to the endpoint
backend.assignServiceNameResolver(async (id: number) => {
if (id in serviceNameCache) {
return serviceNameCache[id];
} else {
const name = await applications.serviceNameFromId(id);
serviceNameCache[id] = name;
return name;
}
});
// Get the stream, and stream it into res
const listenStream = backend.attachListener();

View File

@ -10,7 +10,9 @@ import log from '../lib/supervisor-console';
export class LocalLogBackend extends LogBackend {
private globalListeners: Readable[] = [];
private serviceNameResolver: (serviceId: number) => Bluebird<string>;
private serviceNameResolver: (
serviceId: number,
) => Promise<string> | Bluebird<string>;
public log(message: LogMessage): void {
if (this.publishEnabled) {
@ -31,9 +33,11 @@ export class LocalLogBackend extends LogBackend {
}
// TODO: Can we cache this value? The service ids are reused, so
// we would need a way of invalidating the cache
return this.serviceNameResolver(svcId).then(serviceName => {
return _.assign({}, { serviceName }, message);
});
return (this.serviceNameResolver(svcId) as Promise<string>).then(
(serviceName: string) => {
return _.assign({}, { serviceName }, message);
},
);
} else {
return message;
}
@ -65,7 +69,7 @@ export class LocalLogBackend extends LogBackend {
}
public assignServiceNameResolver(
resolver: (serviceId: number) => Bluebird<string>,
resolver: LocalLogBackend['serviceNameResolver'],
) {
this.serviceNameResolver = resolver;
}