App RouterとPages Routerでprom-clientの値を共有できない

t3-stackでログのメトリクス化のために、prom-clientCounterLoggerクラスで共有することを検討した。 しかし、App RouterPages Routerで共有することができなかった。 具体的にはglobalregisterCounterを登録しようとすると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;
  }
}

回避方法としてregisterLoggerクラスに持たせることができるが、App RouterPages 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 RouterPages Routerに登録されているAPIルートの間で同じではなく不具合が起こるようである。 以下で言及されている。現時点では解決もされていない。

Tags: