0

次のサーブレットがあります。

@Servlet(\path : String -> path.matches("/metrics"))
class MetricsServlet_De extends HttpServlet {
  private var prometheusMeterRegistry : PrometheusMeterRegistry

  override function init() {
    configureMetrics()
  }

  protected override function doGet(request : HttpServletRequest, response : HttpServletResponse) {
    response.ContentType = TextFormat.CONTENT_TYPE_004
    response.setStatus(HttpServletResponse.SC_OK)

    prometheusMeterRegistry.scrape(response.Writer)
  }

  
  private function configureMetrics() : PrometheusMeterRegistry {
    prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
    new ClassLoaderMetrics().bindTo(prometheusMeterRegistry)
    new JvmMemoryMetrics().bindTo(prometheusMeterRegistry)
    new JvmGcMetrics().bindTo(prometheusMeterRegistry)
    new ProcessorMetrics().bindTo(prometheusMeterRegistry)
    new JvmThreadMetrics().bindTo(prometheusMeterRegistry)

    var toDoubleFunction : ToDoubleFunction<GameMetrics> = \status -> status.GameFinished
    Gauge.builder("game_status", new GameMetrics(), toDoubleFunction)
        .description("Return Game status")
        .register(prometheusMeterRegistry)

    return prometheusMeterRegistry
  }


}

サーブレットへの最初の呼び出し時にGameMetrics.GameFinished()が呼び出され、値が適切に表示されます。サーブレットへの後続の呼び出しはすべて呼び出されGameMetrics.GameFinished()なくなり、NaN が返されます。

何が間違っているのかわかりません。

よろしくお願いします

4

1 に答える 1

0

ゲージで状態オブジェクトとして使用するインスタンス (例: ) への参照 (例: プライベート final フィールド) を保持するようにしてくださいGameMetrics

ゲージはWeakReference、GC による収集を妨げない状態オブジェクトを参照するために を使用しています。したがって、あなたの場合、GCがGameMetricsインスタンスを収集してnullになると思います。ドキュメントを参照してください。

于 2021-06-23T18:55:14.953 に答える