otel4s
otel4s copied to clipboard
SDK metrics: native runtime metrics
Runtime metrics:
- memory usage
- cpu usage
- GC stats
- classloader stats
JVM
We can follow the same path as OpenTelemetry Java does and retrieve metrics using MXBeans.
Scala.js
https://github.com/open-telemetry/opentelemetry-js-contrib/pull/2136/files
Scala Native
https://github.com/scala-native/scala-native/issues/4018
Scala Native CPU time:
def getProcessCpuTime(): Long = {
import scala.scalanative.meta.LinktimeInfo
import scala.scalanative.unsafe._
if (LinktimeInfo.isWindows) {
import scala.scalanative.windows.MinWinBaseApi.FileTimeStruct
import scala.scalanative.windows.ProcessThreadsApi
import scala.scalanative.windows.MinWinBaseApiOps._
val creationTime = stackalloc[FileTimeStruct]()
val exitTime = stackalloc[FileTimeStruct]()
val kernelTime = stackalloc[FileTimeStruct]()
val userTime = stackalloc[FileTimeStruct]()
val success = ProcessThreadsApi.GetProcessTimes(
ProcessThreadsApi.GetCurrentProcess(),
creationTime,
exitTime,
kernelTime,
userTime
)
if (success) {
val totalTime = kernelTime.fileTime + userTime.fileTime
totalTime.toLong * FileTimeOps.EpochInterval
} else {
-1L
}
} else {
import scala.scalanative.posix.sys.resource._
import scala.scalanative.posix.sys.resourceOps._
import scala.scalanative.posix.sys.timeOps._
val usage = stackalloc[rusage]()
if (getrusage(RUSAGE_SELF, usage) == 0) {
val micros =
usage.ru_utime.tv_sec * 1000 * 1000 + usage.ru_utime.tv_usec +
usage.ru_stime.tv_sec * 1000 * 1000 + usage.ru_stime.tv_usec
micros.toLong * 1000
} else {
-1L
}
}
}
Scala Native 0.5.5(6) will provide access to MemoryMXBean. But we need to wait for cats-effect to catch up.