From 0c193ca6594ecb0b718c5fe3a3d256c46efc6f75 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Sun, 24 Apr 2022 13:21:13 +0800 Subject: [PATCH 1/8] Add containerPool container histogram metric --- .../main/scala/org/apache/openwhisk/common/Logging.scala | 3 ++- .../containerpool/v2/FunctionPullingContainerPool.scala | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala index caba798d724..53adfe23ee7 100644 --- a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala +++ b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala @@ -412,7 +412,8 @@ object LoggingMarkers { LogMarkerToken(invoker, "sharedPackage", counter, None, Map("path" -> path))(MeasurementUnit.none) def INVOKER_CONTAINERPOOL_MEMORY(state: String) = LogMarkerToken(invoker, "containerPoolMemory", counter, Some(state), Map("state" -> state))(MeasurementUnit.none) - + def INVOKER_CONTAINERPOOL_CONTAINER(state: String) = + LogMarkerToken(invoker, "containerPoolContainer", counter, Some(state), Map("state" -> state))(MeasurementUnit.none) // System overload and random invoker assignment val MANAGED_SYSTEM_OVERLOAD = LogMarkerToken(controller, "managedInvokerSystemOverload", counter)(MeasurementUnit.none) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala index 07029814cb7..bfc65d33dc0 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala @@ -111,6 +111,14 @@ class FunctionPullingContainerPool( MetricEmitter .emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_MEMORY("prewarmed"), memoryConsumptionOf(prewarmedPool)) MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_MEMORY("max"), poolConfig.userMemory.toMB) + val prewarmedSize = prewarmedPool.size + val busySize = busyPool.size + val warmedSize = warmedPool.size + val allSize = prewarmedSize + busySize + warmedSize + MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("prewarmed"), prewarmedSize) + MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("busy"), busySize) + MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("warmed"), warmedSize) + MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("all"), allSize) }) // Key is ColdStartKey, value is the number of cold Start in minute From db90668bd46485c468a5f74763dbc7f575c06ca4 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Sun, 24 Apr 2022 15:40:51 +0800 Subject: [PATCH 2/8] Add pod creation consume time metric --- .../kubernetes/KubernetesClient.scala | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala index 9dd588edafb..5ba09f11d5a 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala @@ -22,7 +22,6 @@ import java.net.SocketTimeoutException import java.time.format.DateTimeFormatterBuilder import java.time.temporal.ChronoField import java.time.{Instant, ZoneId} - import akka.actor.ActorSystem import akka.event.Logging.ErrorLevel import akka.event.Logging.InfoLevel @@ -38,11 +37,18 @@ import collection.JavaConverters._ import io.fabric8.kubernetes.api.model._ import io.fabric8.kubernetes.client.utils.Serialization import io.fabric8.kubernetes.client.{ConfigBuilder, DefaultKubernetesClient} +import kamon.metric.MeasurementUnit import okhttp3.{Call, Callback, Request, Response} import okio.BufferedSource import org.apache.commons.lang3.exception.ExceptionUtils -import org.apache.openwhisk.common.LoggingMarkers -import org.apache.openwhisk.common.{ConfigMapValue, Logging, TransactionId} +import org.apache.openwhisk.common.{ + ConfigMapValue, + LogMarkerToken, + Logging, + LoggingMarkers, + MetricEmitter, + TransactionId +} import org.apache.openwhisk.core.ConfigKeys import org.apache.openwhisk.core.containerpool.docker.ProcessRunner import org.apache.openwhisk.core.containerpool.{ContainerAddress, ContainerId} @@ -145,6 +151,7 @@ class KubernetesClient( log.info(this, s"Pod spec being created\n${Serialization.asYaml(pod)}") } val namespace = kubeRestClient.getNamespace + val t0 = System.currentTimeMillis() val start = transid.started( this, LoggingMarkers.INVOKER_KUBEAPI_CMD("create"), @@ -176,6 +183,11 @@ class KubernetesClient( waitForPod(namespace, createdPod, start.start, config.timeouts.run) .map { readyPod => transid.finished(this, start, logLevel = InfoLevel) + val t1 = System.currentTimeMillis() + MetricEmitter.emitHistogramMetric( + LogMarkerToken("kubeapi", "create", "duration", Some("create"), Map("cmd" -> "create"))( + MeasurementUnit.time.milliseconds), + t1 - t0) toContainer(readyPod) } .recoverWith { From df68fc2a51e397dc8bdaed4fc7cc4d45071dfe09 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Sun, 24 Apr 2022 15:47:23 +0800 Subject: [PATCH 3/8] Add docker container creation consume time metric --- .../core/containerpool/docker/DockerClient.scala | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala index b594f74efab..296c5eb58fc 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala @@ -21,7 +21,6 @@ import java.io.FileNotFoundException import java.nio.file.Files import java.nio.file.Paths import java.util.concurrent.Semaphore - import akka.actor.ActorSystem import scala.collection.concurrent.TrieMap @@ -32,9 +31,10 @@ import scala.util.Failure import scala.util.Success import scala.util.Try import akka.event.Logging.{ErrorLevel, InfoLevel} +import kamon.metric.MeasurementUnit import pureconfig._ import pureconfig.generic.auto._ -import org.apache.openwhisk.common.{Logging, LoggingMarkers, MetricEmitter, TransactionId} +import org.apache.openwhisk.common.{LogMarkerToken, Logging, LoggingMarkers, MetricEmitter, TransactionId} import org.apache.openwhisk.core.ConfigKeys import org.apache.openwhisk.core.containerpool.ContainerId import org.apache.openwhisk.core.containerpool.ContainerAddress @@ -203,8 +203,15 @@ class DockerClient(dockerHost: Option[String] = None, LoggingMarkers.INVOKER_DOCKER_CMD(args.head), s"running ${cmd.mkString(" ")} (timeout: $timeout)", logLevel = InfoLevel) + val t0 = System.currentTimeMillis() executeProcess(cmd, timeout).andThen { - case Success(_) => transid.finished(this, start) + case Success(_) => + val t1 = System.currentTimeMillis() + MetricEmitter.emitHistogramMetric( + LogMarkerToken("docker", "runCmd", "duration", Some(args.head), Map("cmd" -> args.head))( + MeasurementUnit.time.milliseconds), + t1 - t0) + transid.finished(this, start) case Failure(pte: ProcessTimeoutException) => transid.failed(this, start, pte.getMessage, ErrorLevel) MetricEmitter.emitCounterMetric(LoggingMarkers.INVOKER_DOCKER_CMD_TIMEOUT(args.head)) From 09451419f67d9d4a4d7d66a18bc680c5d7cca980 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Tue, 10 May 2022 13:23:59 +0800 Subject: [PATCH 4/8] Use transaction to calculate --- .../openwhisk/core/containerpool/docker/DockerClient.scala | 5 ++--- .../core/containerpool/kubernetes/KubernetesClient.scala | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala index 296c5eb58fc..d4196c0a8ed 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala @@ -39,6 +39,7 @@ import org.apache.openwhisk.core.ConfigKeys import org.apache.openwhisk.core.containerpool.ContainerId import org.apache.openwhisk.core.containerpool.ContainerAddress +import java.time.Instant import scala.concurrent.duration.Duration object DockerContainerId { @@ -203,14 +204,12 @@ class DockerClient(dockerHost: Option[String] = None, LoggingMarkers.INVOKER_DOCKER_CMD(args.head), s"running ${cmd.mkString(" ")} (timeout: $timeout)", logLevel = InfoLevel) - val t0 = System.currentTimeMillis() executeProcess(cmd, timeout).andThen { case Success(_) => - val t1 = System.currentTimeMillis() MetricEmitter.emitHistogramMetric( LogMarkerToken("docker", "runCmd", "duration", Some(args.head), Map("cmd" -> args.head))( MeasurementUnit.time.milliseconds), - t1 - t0) + Instant.now.toEpochMilli - transid.meta.start.toEpochMilli) transid.finished(this, start) case Failure(pte: ProcessTimeoutException) => transid.failed(this, start, pte.getMessage, ErrorLevel) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala index 5ba09f11d5a..5c4e6765f89 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala @@ -151,7 +151,6 @@ class KubernetesClient( log.info(this, s"Pod spec being created\n${Serialization.asYaml(pod)}") } val namespace = kubeRestClient.getNamespace - val t0 = System.currentTimeMillis() val start = transid.started( this, LoggingMarkers.INVOKER_KUBEAPI_CMD("create"), @@ -183,11 +182,10 @@ class KubernetesClient( waitForPod(namespace, createdPod, start.start, config.timeouts.run) .map { readyPod => transid.finished(this, start, logLevel = InfoLevel) - val t1 = System.currentTimeMillis() MetricEmitter.emitHistogramMetric( LogMarkerToken("kubeapi", "create", "duration", Some("create"), Map("cmd" -> "create"))( MeasurementUnit.time.milliseconds), - t1 - t0) + Instant.now.toEpochMilli - transid.meta.start.toEpochMilli) toContainer(readyPod) } .recoverWith { From 998414f3c717b6b5e60fb7bb94145c9aee1f799e Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Tue, 10 May 2022 15:49:49 +0800 Subject: [PATCH 5/8] Add namespace and action tags for container metric --- .../scala/org/apache/openwhisk/common/Logging.scala | 12 ++++++++++-- .../v2/FunctionPullingContainerPool.scala | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala index 53adfe23ee7..48230ee6abb 100644 --- a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala +++ b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala @@ -412,8 +412,16 @@ object LoggingMarkers { LogMarkerToken(invoker, "sharedPackage", counter, None, Map("path" -> path))(MeasurementUnit.none) def INVOKER_CONTAINERPOOL_MEMORY(state: String) = LogMarkerToken(invoker, "containerPoolMemory", counter, Some(state), Map("state" -> state))(MeasurementUnit.none) - def INVOKER_CONTAINERPOOL_CONTAINER(state: String) = - LogMarkerToken(invoker, "containerPoolContainer", counter, Some(state), Map("state" -> state))(MeasurementUnit.none) + def INVOKER_CONTAINERPOOL_CONTAINER(state: String, tags: Option[Map[String, String]] = None) = { + var map = Map("state" -> state) + tags.foreach { mapTags => + for ((k, v) <- mapTags) { + map += (k -> v) + } + } + LogMarkerToken(invoker, "containerPoolContainer", counter, Some(state), map)(MeasurementUnit.none) + } + // System overload and random invoker assignment val MANAGED_SYSTEM_OVERLOAD = LogMarkerToken(controller, "managedInvokerSystemOverload", counter)(MeasurementUnit.none) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala index bfc65d33dc0..a1396b7a0da 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala @@ -110,14 +110,22 @@ class FunctionPullingContainerPool( .emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_MEMORY("busy"), memoryConsumptionOf(busyPool)) MetricEmitter .emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_MEMORY("prewarmed"), memoryConsumptionOf(prewarmedPool)) + MetricEmitter + .emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_MEMORY("warmed"), memoryConsumptionOf(warmedPool)) MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_MEMORY("max"), poolConfig.userMemory.toMB) val prewarmedSize = prewarmedPool.size val busySize = busyPool.size val warmedSize = warmedPool.size + val warmedPoolMap: Map[(String, String), Int] = warmedPool groupBy { + case (_, warmedData) => (warmedData.invocationNamespace, warmedData.action.toString) + } mapValues (_.size) + for((data, size) <- warmedPoolMap) { + val tags: Option[Map[String, String]] = Some(Map("namespace" -> data._1, "action" -> data._2)) + MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("warmed", tags), size) + } val allSize = prewarmedSize + busySize + warmedSize MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("prewarmed"), prewarmedSize) MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("busy"), busySize) - MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("warmed"), warmedSize) MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("all"), allSize) }) From 374c6baa173883073f023e597ff46d20db10c342 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Tue, 10 May 2022 16:40:41 +0800 Subject: [PATCH 6/8] Avoid send metric repeatedly --- .../org/apache/openwhisk/common/Logging.scala | 4 +--- .../core/containerpool/docker/DockerClient.scala | 13 +++---------- .../kubernetes/KubernetesClient.scala | 16 +++------------- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala index 48230ee6abb..686a4b67274 100644 --- a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala +++ b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala @@ -502,12 +502,10 @@ object LoggingMarkers { val INVOKER_ACTIVATION = LogMarkerToken(invoker, activation, start)(MeasurementUnit.none) def INVOKER_DOCKER_CMD(cmd: String) = LogMarkerToken(invoker, "docker", start, Some(cmd), Map("cmd" -> cmd))(MeasurementUnit.time.milliseconds) - def INVOKER_DOCKER_CMD_TIMEOUT(cmd: String) = - LogMarkerToken(invoker, "docker", timeout, Some(cmd), Map("cmd" -> cmd))(MeasurementUnit.none) def INVOKER_RUNC_CMD(cmd: String) = LogMarkerToken(invoker, "runc", start, Some(cmd), Map("cmd" -> cmd))(MeasurementUnit.time.milliseconds) def INVOKER_KUBEAPI_CMD(cmd: String) = - LogMarkerToken(invoker, "kubeapi", start, Some(cmd), Map("cmd" -> cmd))(MeasurementUnit.none) + LogMarkerToken(invoker, "kubeapi", start, Some(cmd), Map("cmd" -> cmd))(MeasurementUnit.time.milliseconds) def INVOKER_CONTAINER_START(containerState: String, invocationNamespace: String, namespace: String, action: String) = LogMarkerToken( invoker, diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala index d4196c0a8ed..4efdc2d6da8 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/docker/DockerClient.scala @@ -21,6 +21,7 @@ import java.io.FileNotFoundException import java.nio.file.Files import java.nio.file.Paths import java.util.concurrent.Semaphore + import akka.actor.ActorSystem import scala.collection.concurrent.TrieMap @@ -31,15 +32,13 @@ import scala.util.Failure import scala.util.Success import scala.util.Try import akka.event.Logging.{ErrorLevel, InfoLevel} -import kamon.metric.MeasurementUnit import pureconfig._ import pureconfig.generic.auto._ -import org.apache.openwhisk.common.{LogMarkerToken, Logging, LoggingMarkers, MetricEmitter, TransactionId} +import org.apache.openwhisk.common.{Logging, LoggingMarkers, TransactionId} import org.apache.openwhisk.core.ConfigKeys import org.apache.openwhisk.core.containerpool.ContainerId import org.apache.openwhisk.core.containerpool.ContainerAddress -import java.time.Instant import scala.concurrent.duration.Duration object DockerContainerId { @@ -205,15 +204,9 @@ class DockerClient(dockerHost: Option[String] = None, s"running ${cmd.mkString(" ")} (timeout: $timeout)", logLevel = InfoLevel) executeProcess(cmd, timeout).andThen { - case Success(_) => - MetricEmitter.emitHistogramMetric( - LogMarkerToken("docker", "runCmd", "duration", Some(args.head), Map("cmd" -> args.head))( - MeasurementUnit.time.milliseconds), - Instant.now.toEpochMilli - transid.meta.start.toEpochMilli) - transid.finished(this, start) + case Success(_) => transid.finished(this, start) case Failure(pte: ProcessTimeoutException) => transid.failed(this, start, pte.getMessage, ErrorLevel) - MetricEmitter.emitCounterMetric(LoggingMarkers.INVOKER_DOCKER_CMD_TIMEOUT(args.head)) case Failure(t) => transid.failed(this, start, t.getMessage, ErrorLevel) } } diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala index 5c4e6765f89..9dd588edafb 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala @@ -22,6 +22,7 @@ import java.net.SocketTimeoutException import java.time.format.DateTimeFormatterBuilder import java.time.temporal.ChronoField import java.time.{Instant, ZoneId} + import akka.actor.ActorSystem import akka.event.Logging.ErrorLevel import akka.event.Logging.InfoLevel @@ -37,18 +38,11 @@ import collection.JavaConverters._ import io.fabric8.kubernetes.api.model._ import io.fabric8.kubernetes.client.utils.Serialization import io.fabric8.kubernetes.client.{ConfigBuilder, DefaultKubernetesClient} -import kamon.metric.MeasurementUnit import okhttp3.{Call, Callback, Request, Response} import okio.BufferedSource import org.apache.commons.lang3.exception.ExceptionUtils -import org.apache.openwhisk.common.{ - ConfigMapValue, - LogMarkerToken, - Logging, - LoggingMarkers, - MetricEmitter, - TransactionId -} +import org.apache.openwhisk.common.LoggingMarkers +import org.apache.openwhisk.common.{ConfigMapValue, Logging, TransactionId} import org.apache.openwhisk.core.ConfigKeys import org.apache.openwhisk.core.containerpool.docker.ProcessRunner import org.apache.openwhisk.core.containerpool.{ContainerAddress, ContainerId} @@ -182,10 +176,6 @@ class KubernetesClient( waitForPod(namespace, createdPod, start.start, config.timeouts.run) .map { readyPod => transid.finished(this, start, logLevel = InfoLevel) - MetricEmitter.emitHistogramMetric( - LogMarkerToken("kubeapi", "create", "duration", Some("create"), Map("cmd" -> "create"))( - MeasurementUnit.time.milliseconds), - Instant.now.toEpochMilli - transid.meta.start.toEpochMilli) toContainer(readyPod) } .recoverWith { From 99d5628e7dc274350f3d3ddbd8fcc6bbb00230d4 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Thu, 26 May 2022 13:22:09 +0800 Subject: [PATCH 7/8] Fix scala 2.13 compilation error --- .../core/containerpool/v2/FunctionPullingContainerPool.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala index a1396b7a0da..94f7bd2f1c3 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/v2/FunctionPullingContainerPool.scala @@ -116,10 +116,10 @@ class FunctionPullingContainerPool( val prewarmedSize = prewarmedPool.size val busySize = busyPool.size val warmedSize = warmedPool.size - val warmedPoolMap: Map[(String, String), Int] = warmedPool groupBy { + val warmedPoolMap = warmedPool groupBy { case (_, warmedData) => (warmedData.invocationNamespace, warmedData.action.toString) } mapValues (_.size) - for((data, size) <- warmedPoolMap) { + for ((data, size) <- warmedPoolMap) { val tags: Option[Map[String, String]] = Some(Map("namespace" -> data._1, "action" -> data._2)) MetricEmitter.emitHistogramMetric(LoggingMarkers.INVOKER_CONTAINERPOOL_CONTAINER("warmed", tags), size) } From 53cbe7fcab3adfa40a577a60b97647351f2957b7 Mon Sep 17 00:00:00 2001 From: "ning.yougang" Date: Thu, 26 May 2022 15:27:00 +0800 Subject: [PATCH 8/8] Update according to review comment --- .../main/scala/org/apache/openwhisk/common/Logging.scala | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala index 686a4b67274..3072ff33d57 100644 --- a/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala +++ b/common/scala/src/main/scala/org/apache/openwhisk/common/Logging.scala @@ -413,12 +413,7 @@ object LoggingMarkers { def INVOKER_CONTAINERPOOL_MEMORY(state: String) = LogMarkerToken(invoker, "containerPoolMemory", counter, Some(state), Map("state" -> state))(MeasurementUnit.none) def INVOKER_CONTAINERPOOL_CONTAINER(state: String, tags: Option[Map[String, String]] = None) = { - var map = Map("state" -> state) - tags.foreach { mapTags => - for ((k, v) <- mapTags) { - map += (k -> v) - } - } + val map = Map("state" -> state) ++: tags.getOrElse(Map.empty) LogMarkerToken(invoker, "containerPoolContainer", counter, Some(state), map)(MeasurementUnit.none) }