New Relic Java エージェントは Scala と互換性があり 、New Relic API コール、アノテーション、 カスタムインスツルメンテーションをサポートしています 。以下の情報はすべて、New Relic の Java エージェントのインストール方法 を補足するものです。
ヒント
Herokuについては、 Java agent with Scala on Heroku を参照してください。
Scalaのフレームワーク
フレームワーク がNew Relicにネイティブに対応していない場合や、追加のモニタリングを設定したい場合は、 カスタムインスツルメンテーション を利用すると、アプリケーションをより深く掘り下げることができます。
Scala APIでScalaを動かす
New Relic Scala エージェント API では、慣用的な Scala コードを使用して、APM Java エージェントの機能を制御、カスタマイズ、拡張することができます。 New Relic Java API と並行して使用することができ、ユーザーは以下のことが可能になります。
- 同期および非同期の匿名関数のためのセグメントの作成
- 同期および非同期コードブロックのためのセグメントの作成
- トランザクションが開始されていない場合は、トランザクションを作成します。
重要
API を使用する際に最良の結果を得るためには、最新の Java エージェントのリリースがあることを確認してください。New Relic Scala API には、Java agent 7.1.0 以降が必要です。
ScalaのAPIを使う
APIクラスにアクセスするには、Scalaの設定ファイルに以下の情報を追加してください。
対応するScalaのバージョンは2.10、2.11、2.12、2.13です。Scala 3.0 のユーザーは、2.13 の jar を使用できます。この jar は Maven Central にデプロイされ、New Relic Java エージェントのインストール zip ファイルにも含まれています。Java エージェントが実行されていないときでも、API を呼び出すことができます。基本となる API メソッドは単なるスタブであり、実装は Java エージェントが実行されているときに追加されます。
セグメント
同期コード ブロックのセグメントを作成するには、 TraceOps.trace
を使用します。例えば:
import com.newrelic.scala.api.TraceOps.trace
trace("statement segment") { val i = 1 val j = 2 println(i + j)}// trace can also be used as an expressionval x: Int = trace("expression segment") { val i = 1 val j = 2 i + j}println(x) // 2
trace
Scalaでも使用できます
import scala.concurrent.{ExecutionContext, Future}import com.newrelic.scala.api.TraceOps.trace
// implicit executionimplicit val ec: ExecutionContext = ???
val x: Option[Int] = for { one <- trace("segment one")(Option(1)) two <- trace("segment two")(Option(one + 1)) three <- trace("segment three")(Option(two + 1)) } yield three
println(x) // Some(3)
Scala Future を含む非同期コード ブロックのセグメントを作成する場合は、 TraceOps.asyncTrace
を使用します。これにより、セグメントのタイミングに Future の完了にかかる時間が含まれるようになります。
以下の例では、ラッピングされたFutureで遅延が発生するため、セグメントタイムは5秒以上になります。
import scala.concurrent.{ExecutionContext, Future}import com.newrelic.scala.api.TraceOps.asyncTrace// implicit executionimplicit val ec: ExecutionContext = ???
val x: Future[Int] = asyncTrace("segment name")(Future { Thread.sleep(5000) 1})x.foreach(println) // prints 1 on completion of Future
asyncTrace
Scalaでも使用できます
import scala.concurrent.{ExecutionContext, Future}import com.newrelic.scala.api.TraceOps.asyncTrace// implicit executionimplicit val ec: ExecutionContext = ???
val x: Future[Int] = for { one <- asyncTrace("segment one")(Future(1)) two <- asyncTrace("segment two")(Future(one + 1)) three <- asyncTrace("segment three")(Future(two + 1)) } yield three
x.foreach(println) // prints 3 on completion of Future
同期匿名関数のセグメントを作成する場合は、 TraceOps.traceFun
を使用します。例えば:
import com.newrelic.scala.api.TraceOps.traceFun
val x: Option[Int] = Option(1) .map(traceFun("statement segment")(i => i + 1))println(x) //Some(2)
Scala Future を返す非同期関数のセグメントを作成する場合は、 TraceOps.asyncTraceFun
を使用します。これにより、セグメントのタイミングに関数の完了にかかる時間が含まれるようになります。
以下の例では、ラッピングされたFutureで遅延が発生するため、セグメントタイムは5秒以上になります。
import scala.concurrent.{ExecutionContext, Future}import com.newrelic.scala.api.TraceOps.asyncTraceFun// implicit executionimplicit val ec: ExecutionContext = ???
val x: Future[Int] = Future(1) .flatMap(asyncTraceFun("statement segment")(i => Future(i + 1)))
x.foreach(println) // prints 2 on completion of Future
トランザクション
トランザクションは、 TraceOps.txn
メソッドを使用して作成できます。例えば:
import com.newrelic.scala.api.TraceOps.txntxn { val i = 1 val j = 2 println(i + j)}
txn
(上記のように) ステートメントとして、または式として使用できます。
import com.newrelic.scala.api.TraceOps.txnval i: Int = txn(1 + 2) //transaction createdprintln(i) // 3
txn
TraceOp
メソッドのいずれかと一緒に使用して、セグメントを作成できます。以下の例では、3 つのセグメントを持つトランザクションを作成します。
import scala.concurrent.{ExecutionContext, Future}import com.newrelic.scala.api.TraceOps.{txn, asyncTrace}// implicit executionimplicit val ec: ExecutionContext = ???
val x: Future[Int] = txn( for { one <- asyncTrace("segment one")(Future(1)) two <- asyncTrace("segment two")(Future(one + 1)) three <- asyncTrace("segment three")(Future(two + 1)) } yield three )
x.foreach(println) // prints 3 on completion of Future
Java agent APIでScalaをインストゥルメントする
New Relic API クラスまたは アノテーションを使用するために Scala をインスツルメントする.
Scalaの設定ファイルに以下の情報を追加してください。
NewRelicクラスをインポートして、アプリケーションで使用します。
import com.newrelic.api.agent.NewRelic...NewRelic.setTransactionName(null, "/myTransaction");
追加API機能
JavaエージェントAPIとその機能の詳細については、JavaエージェントAPI入門を参照してください。
XMLインストゥルメンテーションによるScalaのインストゥルメント
XMLインスツルメンテーションは、Javaエージェントで動作するすべてのScalaアプリケーションで利用できます。これにより、コードに変更を加えることなくインスツルメンテーションを追加することができます。
詳しくは、 Java instrumentation by XML をご覧ください。
追加のインストゥルメンテーション
Kamonをお使いの方は、New Relic Kamon reporter をご覧ください。