You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ni...@apache.org on 2022/05/26 08:00:43 UTC

[openwhisk] branch add-container-count-metric created (now 09d1e9230)

This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a change to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git


      at 09d1e9230 Update according to review comment

This branch includes the following new commits:

     new 0c193ca65 Add containerPool container histogram metric
     new db90668bd Add pod creation consume time metric
     new df68fc2a5 Add docker container creation consume time metric
     new 09451419f Use transaction to calculate
     new 998414f3c Add namespace and action tags for container metric
     new 374c6baa1 Avoid send metric repeatedly
     new 8ba090259 Fix scala 2.13 compilation error
     new 09d1e9230 Update according to review comment

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[openwhisk] 06/08: Avoid send metric repeatedly

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 374c6baa173883073f023e597ff46d20db10c342
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Tue May 10 16:40:41 2022 +0800

    Avoid send metric repeatedly
---
 .../main/scala/org/apache/openwhisk/common/Logging.scala |  4 +---
 .../core/containerpool/docker/DockerClient.scala         | 13 +++----------
 .../core/containerpool/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 48230ee6a..686a4b672 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 d4196c0a8..4efdc2d6d 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 5c4e6765f..9dd588eda 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 {


[openwhisk] 04/08: Use transaction to calculate

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 09451419f67d9d4a4d7d66a18bc680c5d7cca980
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Tue May 10 13:23:59 2022 +0800

    Use transaction to calculate
---
 .../apache/openwhisk/core/containerpool/docker/DockerClient.scala    | 5 ++---
 .../openwhisk/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 296c5eb58..d4196c0a8 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 5ba09f11d..5c4e6765f 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 {


[openwhisk] 01/08: Add containerPool container histogram metric

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 0c193ca6594ecb0b718c5fe3a3d256c46efc6f75
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Sun Apr 24 13:21:13 2022 +0800

    Add containerPool container histogram metric
---
 .../src/main/scala/org/apache/openwhisk/common/Logging.scala      | 3 ++-
 .../core/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 caba798d7..53adfe23e 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 07029814c..bfc65d33d 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


[openwhisk] 08/08: Update according to review comment

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 09d1e923008b9550330563c16b5b171917f01801
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Thu May 26 15:27:00 2022 +0800

    Update according to review comment
---
 .../scala/src/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 686a4b672..3072ff33d 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)
   }
 


[openwhisk] 05/08: Add namespace and action tags for container metric

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 998414f3c717b6b5e60fb7bb94145c9aee1f799e
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Tue May 10 15:49:49 2022 +0800

    Add namespace and action tags for container metric
---
 .../src/main/scala/org/apache/openwhisk/common/Logging.scala | 12 ++++++++++--
 .../core/containerpool/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 53adfe23e..48230ee6a 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 bfc65d33d..a1396b7a0 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)
   })
 


[openwhisk] 07/08: Fix scala 2.13 compilation error

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 8ba0902595d3aaf58354560cd5001fefd138fe0b
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Thu May 26 13:22:09 2022 +0800

    Fix scala 2.13 compilation error
---
 .../core/containerpool/v2/FunctionPullingContainerPool.scala       | 7 +++----
 1 file changed, 3 insertions(+), 4 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 a1396b7a0..d305ef349 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
@@ -19,7 +19,6 @@ package org.apache.openwhisk.core.containerpool.v2
 
 import java.util.concurrent.atomic.AtomicInteger
 import akka.actor.{Actor, ActorRef, ActorRefFactory, Cancellable, Props}
-
 import org.apache.openwhisk.common._
 import org.apache.openwhisk.core.connector.ContainerCreationError._
 import org.apache.openwhisk.core.connector.{
@@ -44,7 +43,7 @@ import org.apache.openwhisk.http.Messages
 
 import scala.annotation.tailrec
 import scala.collection.concurrent.TrieMap
-import scala.collection.immutable
+import scala.collection.{immutable, mutable}
 import scala.concurrent.Future
 import scala.concurrent.duration._
 import scala.util.{Random, Try}
@@ -116,10 +115,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)
     }


[openwhisk] 02/08: Add pod creation consume time metric

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit db90668bd46485c468a5f74763dbc7f575c06ca4
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Sun Apr 24 15:40:51 2022 +0800

    Add pod creation consume time metric
---
 .../containerpool/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 9dd588eda..5ba09f11d 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 {


[openwhisk] 03/08: Add docker container creation consume time metric

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch add-container-count-metric
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit df68fc2a51e397dc8bdaed4fc7cc4d45071dfe09
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Sun Apr 24 15:47:23 2022 +0800

    Add docker container creation consume time metric
---
 .../openwhisk/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 b594f74ef..296c5eb58 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))