• ログイン今すぐ開始

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

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

問題を作成する

Scalaのインストルメント

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 expression
val x: Int = trace("expression segment") {
val i = 1
val j = 2
i + j
}
println(x) // 2

トレース はScalaでも使用できます 内包の場合

import scala.concurrent.{ExecutionContext, Future}
import com.newrelic.scala.api.TraceOps.trace
// implicit execution
implicit 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 execution
implicit 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 execution
implicit 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.asyncTrace を使用してください。これにより、セグメントのタイミングに、関数が完了するまでの時間が含まれるようになります。

以下の例では、ラッピングされたFutureで遅延が発生するため、セグメントタイムは5秒以上になります。

import scala.concurrent.{ExecutionContext, Future}
import com.newrelic.scala.api.TraceOps.asyncTraceFun
// implicit execution
implicit 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.txn
txn {
val i = 1
val j = 2
println(i + j)
}

txn は、ステートメントとして(上記のように)、または式として使用できます。

import com.newrelic.scala.api.TraceOps.txn
val i: Int = txn(1 + 2) //transaction created
println(i) // 3

txn は、 TraceOp のいずれかのメソッドと組み合わせて使用することで、セグメントを作成することができます。以下の例では、3 つのセグメントを持つトランザクションを作成しています。

import scala.concurrent.{ExecutionContext, Future}
import com.newrelic.scala.api.TraceOps.{txn, asyncTrace}
// implicit execution
implicit 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 をインスツルメントする.

  1. Scalaの設定ファイルに以下の情報を追加してください。

  2. 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 をご覧ください。

Copyright © 2022 New Relic株式会社。