• ログイン今すぐ開始

本書は、お客様のご参考のために原文の英語版を機械翻訳したものです。

英語版と齟齬がある場合、英語版の定めが優先するものとします。より詳しい情報については、本リンクをご参照ください。

問題を作成する

ScalaAkkaHTTPコアインストルメンテーション

Javaエージェントリリース7.8.0の導入により、bindAndHandleメソッドのデフォルトのインストルメンテーションを削除するように変更が加えられ、誤って重複したトランザクションが報告される可能性のあるシナリオが排除されました。状況によっては、この変更を補正するために明示的なメソッド呼び出しを行う必要がある場合があります。

背景:HttpExtインストルメンテーション

Akka HTTP Coreのインストルメンテーションは、サーバーのメインエントリポイントとして機能するakka.http.scaladsl.HttpExtクラスで実行されます。HTTPサーバーの起動に使用できるHttpExtの2つの便利なメソッドが装備されています。

  • bindAndHandleAsync:指定されたエンドポイントで新しいHTTPサーバーを起動し、 HttpRequestを受信して Future[HttpResponse]
  • bindAndHandleSync:指定されたエンドポイントで新しいHTTPサーバーを起動し、 HttpRequestを受信して HttpResponse

トランザクションの誤った重複が報告されないようにするために、 akka.stream.scaladsl.Flowインスタンスを使用して新しいHTTPサーバーを起動するbindAndHandleメソッドにインストルメンテーションが適用されなくなりました。

トランザクションの重複は、Akka HttpRoutingDSLインストルメンテーションの衝突によるものです。

解決策-bindAndHandleAsyncを明示的に呼び出します

akka.stream.scaladsl.FlowからHTTPサーバーを起動する場合は、 bindAndHandleAsyncメソッドを明示的に呼び出す必要があります。例えば:

...
val flow: Flow[HttpRequest, HttpResponse, NotUsed] = ???
val asyncHandler: HttpRequest => Future[HttpResponse] = request => Source.single(request).via(flow).runWith(Sink.head)
Http().bindAndHandleAsync(asyncHandler, host, port)
...

重要

Akka HTTP Routing DSLを使用してakka.http.scaladsl.RouteからHTTPサーバーを起動するときにbindAndHandleを呼び出すという、同様の回避策は必要ありません。エージェントインストルメンテーションは、他の便利なメソッドから呼び出されたときに正常に機能します。

Copyright © 2022 New Relic株式会社。

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.