App RouterとPages Routerでprom-clientの値を共有できない
t3-stackでログのメトリクス化のために、prom-client
のCounter
をLogger
クラスで共有することを検討した。
しかし、App Router
とPages Router
で共有することができなかった。
具体的にはglobal
のregister
にCounter
を登録しようとするとPages Router
ではビルドエラーになる。
import { Counter } from 'prom-client';
class Logger {
private static instance: Logger;
private errorCounter: Counter<string>;
private warnCounter: Counter<string>;
private constructor() {
this.errorCounter = new Counter({
name: 'errors_total',
});
this.warnCounter = new Counter({
name: 'warnings_total',
});
}
public static getInstance(): Logger {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
}
回避方法としてregister
をLogger
クラスに持たせることができるが、App Router
とPages Router
で別々のinstance
を使用することとなる。そのため、やはりメトリクスを共有できない。
import { Counter, register } from 'prom-client';
class Logger {
private static instance: Logger;
private errorCounter: Counter<string>;
private warnCounter: Counter<string>;
private registerInstance: typeof register;
private constructor() {
this.errorCounter = new Counter({
name: 'errors_total',
});
this.warnCounter = new Counter({
name: 'warnings_total',
});
this.registerInstance = register;
this.registerInstance.registerMetric(this.errorCounter);
this.registerInstance.registerMetric(this.warnCounter);
}
public static getInstance(): Logger {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
// Method to register a metric (Counter)
public register(metric: Counter<string>) {
this.registerInstance.registerMetric(metric);
}
}
export default Logger;
global
オブジェクトが、App Router
とPages Router
に登録されているAPIルートの間で同じではなく不具合が起こるようである。
以下で言及されている。現時点では解決もされていない。
Tags: