ZIO es una biblioteca Scala utilizada para ejecutar operaciones asincrónicas. Para aprovechar al máximo la estructura evaluada de forma diferida de ZIO, ofrecemos una API de ZIO para crear transacciones y segmentos.
Instalar la API de ZIO
Para acceder a la clase API, agregue la siguiente información a su archivo de configuración de Scala según la versión de ZIO que esté utilizando.
Las versiones compatibles de Scala son 2.11, 2.12 y 2.13. El usuario de Scala 3.0 puede utilizar el jar 2.13. La versión mínima de Scala para ZIO v2 es 2.12.
Importante
Para obtener mejores resultados al utilizar la API, asegúrese de tener la última versión del agente de Java.
- La New Relic ZIO v1 API requiere agente de Java 7.2.0 o superior.
- La New Relic ZIO v2 API requiere agente de Java 8.10.0 o superior.
Utilice la API de ZIO
Primero debe realizar su declaración de importación y luego podrá crear transacciones y segmentos.
Hacer declaración de importación
Para aprovechar la API de ZIO, realice la siguiente declaración de importación para su versión:
API ZIO v1
import com.newrelic.zio.api.TraceOps
API ZIO v2
import com.newrelic.zio2.api.TraceOps
Las API para ambos son las mismas excepto por los nombres de los paquetes.
Crear transacción
Puede crear transacciones de forma perezosa utilizando el método TraceOps.txn
. Si ya existe una transacción antes de llamar al método, este método será parte de la transacción existente.
Importante
A diferencia del método de transacción de Scala API, este método no crea una transacción con entusiasmo. En su lugar, pasa un bloque ZIO
en el que se crea un efecto en una instancia devuelta que crea perezosamente un rastreador de transacciones. Finaliza cuando finalizan todas las operaciones de ZIO. Como resultado, cualquier código que se ejecute fuera de cualquier instancia u operación de ZIO no se capturará en la nueva transacción.
Por ejemplo:
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))}
Crear segmentos
Para crear un segmento para un bloque de código síncrono, utilice TraceOps.trace
. Por ejemplo:
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
Importante
TraceOps.trace
sólo funciona con código síncrono. Cualquier operación realizada a través de un efecto, operación o ambos de ZIO debe utilizar TraceOps.asyncTrace
(ver más abajo).
Si desea crear un segmento para un bloque de código asincrónico usando ZIO, use TraceOps.asyncTrace
. Esto garantizará que el tiempo del segmento incluya el tiempo necesario para que se complete el efecto u operación 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.
También puedes usar asyncTrace
en Scala para comprensión:
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 desea crear un segmento para una función anónima sincrónica, utilice TraceOps.traceFun
. Por ejemplo:
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 desea crear un segmento para una función asincrónica que devuelva una instancia ZIO,
utilizar TraceOps.asyncTraceFun
. Esto garantizará que el cronograma del segmento incluya el tiempo necesario para completar las operaciones de ZIO. Por ejemplo:
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
Más funciones API
Para obtener más información sobre la API del agente de Java y su funcionalidad, consulte la introducción a la API del agente de Java.