ZIO est une bibliothèque Scala utilisée pour exécuter des opérations asynchrones. Afin de tirer pleinement parti de la structure évaluée paresseusement de ZIO, nous proposons une API ZIO pour créer des transactions et des segments.
Installer l'API ZIO
Pour accéder à la classe API, ajoutez les informations suivantes à votre fichier de configuration Scala en fonction de la version de ZIO que vous utilisez.
Les versions de Scala prises en charge sont 2.11, 2.12 et 2.13. Scala 3.0 utilisateur peut utiliser le pot 2.13. La version minimale de Scala pour ZIO v2 est 2.12.
Important
Pour de meilleurs résultats lors de l'utilisation de l'API, assurez-vous que vous disposez de la dernière version agent Java .
- L'API New Relic ZIO v1 nécessite l'agent Java 7.2.0 ou supérieur.
- L'API New Relic ZIO v2 nécessite l'agent Java 8.10.0 ou supérieur.
Utiliser l'API ZIO
Vous devez d’abord créer votre déclaration d’importation, puis vous pouvez créer des transactions et des segments.
Faire une déclaration d'importation
Pour tirer parti de l'API ZIO, effectuez l'instruction d'importation suivante pour votre version :
API ZIO v1
import com.newrelic.zio.api.TraceOps
API ZIO v2
import com.newrelic.zio2.api.TraceOps
L'API pour les deux est la même, à l'exception des noms package .
Créer des transactions
Vous pouvez créer des transactions paresseusement en utilisant la méthode TraceOps.txn
. Si une transaction existe déjà avant l'appel de la méthode, cette méthode fera partie de la transaction existante.
Important
Contrairement à la méthode de transaction de l'API Scala, cette méthode ne crée pas de transaction avec empressement. Au lieu de cela, vous transmettez un bloc ZIO
dans lequel un effet est créé dans une instance renvoyée qui crée paresseusement un traceur de transaction. Cela se termine lorsque toutes les opérations ZIO se terminent. Par conséquent, tout code exécuté en dehors de toute instance ou opération ZIO ne sera pas capturé dans la nouvelle transaction.
Par exemple:
import com.newrelic.zio.api.TraceOps.{txn, traceFun, trace}// or if using ZIO 2, comment out the line above and uncomment the line below// import com.newrelic.zio2.api.TraceOps.{txn, traceFun, trace}
val x = txn { // The segment named "not-captured" will not be // captured in the transaction because it is not ran within Zio. trace("not-captured") { println("hello") }
// The segment named "trace map UIO" will be // captured as part of the transaction because it is ran within Zio. ZIO.succeed(1).map(traceFun("trace map UIO")(i => i + 1))}
Créer des segments
Pour créer un segment pour un bloc de code synchrone, utilisez TraceOps.trace
. Par exemple:
import com.newrelic.zio.api.TraceOps.trace// or if using ZIO 2, comment out the line above and uncomment the line below// import com.newrelic.zio2.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
Important
TraceOps.trace
fonctionne uniquement avec du code synchrone. Toutes les opérations effectuées via un effet ZIO, une opération ou les deux doivent plutôt utiliser TraceOps.asyncTrace
(voir ci-dessous).
Si vous souhaitez créer un segment pour un bloc de code asynchrone à l'aide de ZIO, utilisez TraceOps.asyncTrace
. Cela garantira que le timing du segment inclut le temps nécessaire à l'achèvement de l'effet ou de l'opération ZIO.
import zio.ZIOimport com.newrelic.zio.api.TraceOps.asyncTrace// or if using ZIO 2, comment out the line above and uncomment the line below// import com.newrelic.zio2.api.TraceOps.asyncTrace
val x: ZIO[_, _, Int] = asyncTrace("segment name") { ZIO.succeed(1) <* ZIO.sleep(zio.duration.Duration.fromMillis(1.second.toMillis))}.debug // prints 1 after the completion of the segment.
Vous pouvez également utiliser asyncTrace
en Scala pour les compréhensions :
import zio.ZIOimport com.newrelic.zio.api.TraceOps.asyncTrace// or if using ZIO 2, comment out the line above and uncomment the line below// import com.newrelic.zio2.api.TraceOps.asyncTrace
val x: ZIO[_, _, Int] = for { one <- asyncTrace("segment one")(ZIO.succeed(1)) two <- asyncTrace("segment two")(ZIO.succeed(one + 1)) three <- asyncTrace("segment three")(ZIO.succeed(two + 1)) } yield three
val x2 = x.debug // prints 3 on completion of the segments in x
Si vous souhaitez créer un segment pour une fonction anonyme synchrone, utilisez TraceOps.traceFun
. Par exemple:
import zio.ZIOimport com.newrelic.zio.api.TraceOps.asyncTraceFun// or if using ZIO 2, comment out the line above and uncomment the line below// import com.newrelic.zio2.api.TraceOps.asyncTraceFun
val x: ZIO[_, _, Int] = ZIO.succeed(1) .map(traceFun("statement segment")(i => i + 1)) .debug // prints 2
Si vous souhaitez créer un segment pour une fonction asynchrone qui renvoie une instance ZIO,\
utiliser TraceOps.asyncTraceFun
. Cela garantira que le timing du segment inclut le temps nécessaire à la réalisation des opérations ZIO. Par exemple:
import zio.ZIOimport com.newrelic.zio.api.TraceOps.asyncTraceFun// or if using ZIO 2, comment out the line above and uncomment the line below// import com.newrelic.zio2.api.TraceOps.asyncTraceFun
val x: ZIO[_, _, Int] = ZIO.succeed(1) .flatMap(asyncTraceFun("statement segment")(i => ZIO.succeed(i + 1))) .debug // prints 2 on completion of the zio operations
Plus de fonctions API
Pour en savoir plus sur l'API de l'agent Java et ses fonctionnalités, consultez l'introduction à l'API de l'agent Java.