You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2019/01/07 14:35:13 UTC

[incubator-skywalking] branch prometheus created (now 2107b3a)

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

wusheng pushed a change to branch prometheus
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git.


      at 2107b3a  Finish the basic codes of telemetry.

This branch includes the following new commits:

     new 2107b3a  Finish the basic codes of telemetry.

The 1 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.



[incubator-skywalking] 01/01: Finish the basic codes of telemetry.

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

wusheng pushed a commit to branch prometheus
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git

commit 2107b3a3f42e3dfcad5a247bfbadadf2af2eac09
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Mon Jan 7 22:34:54 2019 +0800

    Finish the basic codes of telemetry.
---
 .../cluster/plugin/consul/ConsulCoordinator.java   | 19 ++----
 .../plugin/kubernetes/KubernetesCoordinator.java   |  2 +
 .../plugin/standalone/StandaloneManager.java       |  2 +
 .../plugin/zookeeper/ZookeeperCoordinator.java     |  2 +
 .../core/remote/client/RemoteClientManager.java    | 34 ++++++----
 oap-server/server-starter/pom.xml                  |  7 ++
 .../src/main/resources/application.yml             |  2 +-
 .../oap/server/telemetry/api/CounterMetric.java    |  2 +-
 .../oap/server/telemetry/api/GaugeMetric.java      | 17 +++--
 .../oap/server/telemetry/api/HistogramMetric.java  |  4 +-
 .../oap/server/telemetry/api/MetricCreator.java    | 12 ++--
 .../oap/server/telemetry/api/MetricTag.java        |  7 +-
 .../telemetry/api/TelemetryRelatedContext.java     | 10 +--
 .../server/telemetry/none/MetricCreatorNoop.java   | 47 +++++++++++--
 .../server-telemetry/telemetry-prometheus/pom.xml  |  5 ++
 .../server/telemetry/prometheus/BaseMetric.java    | 79 ++++++++++++++++++++++
 .../telemetry/prometheus/PrometheusConfig.java}    | 14 ++--
 .../prometheus/PrometheusCounterMetric.java        | 54 +++++++++++++++
 .../prometheus/PrometheusGaugeMetric.java          | 75 ++++++++++++++++++++
 .../prometheus/PrometheusHistogramMetric.java      | 58 ++++++++++++++++
 .../prometheus/PrometheusMetricCreator.java}       | 21 +++---
 .../prometheus/PrometheusTelemetryProvider.java    | 70 +++++++++++++++++++
 ...alking.oap.server.library.module.ModuleProvider | 20 ++++++
 23 files changed, 495 insertions(+), 68 deletions(-)

diff --git a/oap-server/server-cluster-plugin/cluster-consul-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/consul/ConsulCoordinator.java b/oap-server/server-cluster-plugin/cluster-consul-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/consul/ConsulCoordinator.java
index 7cf732c..5584a62 100644
--- a/oap-server/server-cluster-plugin/cluster-consul-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/consul/ConsulCoordinator.java
+++ b/oap-server/server-cluster-plugin/cluster-consul-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/consul/ConsulCoordinator.java
@@ -19,22 +19,14 @@
 package org.apache.skywalking.oap.server.cluster.plugin.consul;
 
 import com.google.common.base.Strings;
-import com.orbitz.consul.AgentClient;
-import com.orbitz.consul.Consul;
-import com.orbitz.consul.HealthClient;
-import com.orbitz.consul.model.agent.ImmutableRegistration;
-import com.orbitz.consul.model.agent.Registration;
+import com.orbitz.consul.*;
+import com.orbitz.consul.model.agent.*;
 import com.orbitz.consul.model.health.ServiceHealth;
-import org.apache.skywalking.oap.server.core.cluster.ClusterNodesQuery;
-import org.apache.skywalking.oap.server.core.cluster.ClusterRegister;
-import org.apache.skywalking.oap.server.core.cluster.RemoteInstance;
-import org.apache.skywalking.oap.server.core.cluster.ServiceRegisterException;
+import java.util.*;
+import org.apache.skywalking.oap.server.core.cluster.*;
 import org.apache.skywalking.oap.server.core.remote.client.Address;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import org.apache.skywalking.oap.server.telemetry.api.TelemetryRelatedContext;
 
 /**
  * @author peng-yongsheng
@@ -77,6 +69,7 @@ public class ConsulCoordinator implements ClusterRegister, ClusterNodesQuery {
         AgentClient agentClient = client.agentClient();
 
         this.selfAddress = remoteInstance.getAddress();
+        TelemetryRelatedContext.INSTANCE.setId(selfAddress.toString());
 
         Registration registration = ImmutableRegistration.builder()
             .id(remoteInstance.getAddress().toString())
diff --git a/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/KubernetesCoordinator.java b/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/KubernetesCoordinator.java
index 8fdc5f8..730f4b2 100644
--- a/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/KubernetesCoordinator.java
+++ b/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/KubernetesCoordinator.java
@@ -26,6 +26,7 @@ import java.util.function.Supplier;
 import javax.annotation.Nullable;
 import org.apache.skywalking.oap.server.core.cluster.*;
 import org.apache.skywalking.oap.server.core.remote.client.Address;
+import org.apache.skywalking.oap.server.telemetry.api.TelemetryRelatedContext;
 import org.slf4j.*;
 
 /**
@@ -49,6 +50,7 @@ public class KubernetesCoordinator implements ClusterRegister, ClusterNodesQuery
     KubernetesCoordinator(final ReusableWatch<Event> watch, final Supplier<String> uidSupplier) {
         this.watch = watch;
         this.uid = uidSupplier.get();
+        TelemetryRelatedContext.INSTANCE.setId(uid);
     }
 
     @Override public void registerRemote(RemoteInstance remoteInstance) throws ServiceRegisterException {
diff --git a/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/StandaloneManager.java b/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/StandaloneManager.java
index ef30870..b70873f 100644
--- a/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/StandaloneManager.java
+++ b/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/StandaloneManager.java
@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.cluster.plugin.standalone;
 
 import java.util.*;
 import org.apache.skywalking.oap.server.core.cluster.*;
+import org.apache.skywalking.oap.server.telemetry.api.TelemetryRelatedContext;
 
 /**
  * A cluster manager simulator. Work in memory only. Also return the current instance.
@@ -33,6 +34,7 @@ public class StandaloneManager implements ClusterNodesQuery, ClusterRegister {
     @Override public void registerRemote(RemoteInstance remoteInstance) {
         this.remoteInstance = remoteInstance;
         this.remoteInstance.getAddress().setSelf(true);
+        TelemetryRelatedContext.INSTANCE.setId("standalone");
     }
 
     @Override
diff --git a/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ZookeeperCoordinator.java b/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ZookeeperCoordinator.java
index 826bdbb..837f3f3 100644
--- a/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ZookeeperCoordinator.java
+++ b/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ZookeeperCoordinator.java
@@ -22,6 +22,7 @@ import java.util.*;
 import org.apache.curator.x.discovery.*;
 import org.apache.skywalking.oap.server.core.cluster.*;
 import org.apache.skywalking.oap.server.core.remote.client.Address;
+import org.apache.skywalking.oap.server.telemetry.api.TelemetryRelatedContext;
 import org.slf4j.*;
 
 /**
@@ -59,6 +60,7 @@ public class ZookeeperCoordinator implements ClusterRegister, ClusterNodesQuery
             serviceCache.start();
 
             this.selfAddress = remoteInstance.getAddress();
+            TelemetryRelatedContext.INSTANCE.setId(selfAddress.toString());
         } catch (Exception e) {
             throw new ServiceRegisterException(e.getMessage());
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
index 2510a11..5978772 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
@@ -24,12 +24,13 @@ import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.cluster.*;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamDataClassGetter;
 import org.apache.skywalking.oap.server.library.module.*;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.*;
 import org.slf4j.*;
 
 /**
- * This class manages the connections between OAP servers. There is a task schedule that will
- * automatically query a server list from the cluster module. Such as Zookeeper cluster module
- * or Kubernetes cluster module.
+ * This class manages the connections between OAP servers. There is a task schedule that will automatically query a
+ * server list from the cluster module. Such as Zookeeper cluster module or Kubernetes cluster module.
  *
  * @author peng-yongsheng
  */
@@ -43,6 +44,7 @@ public class RemoteClientManager implements Service {
     private final List<RemoteClient> clientsA;
     private final List<RemoteClient> clientsB;
     private volatile List<RemoteClient> usingClients;
+    private GaugeMetric gauge;
 
     public RemoteClientManager(ModuleDefineHolder moduleDefineHolder) {
         this.moduleDefineHolder = moduleDefineHolder;
@@ -56,11 +58,15 @@ public class RemoteClientManager implements Service {
     }
 
     /**
-     * Query OAP server list from the cluster module and create a new connection
-     * for the new node. Make the OAP server orderly because of each of the server
-     * will send stream data to each other by hash code.
+     * Query OAP server list from the cluster module and create a new connection for the new node. Make the OAP server
+     * orderly because of each of the server will send stream data to each other by hash code.
      */
     void refresh() {
+        if (gauge == null) {
+            gauge = moduleDefineHolder.find(TelemetryModule.NAME).provider().getService(MetricCreator.class)
+                .createGauge("cluster_size", "Cluster size of current oap node",
+                    MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
+        }
         try {
             if (Objects.isNull(clusterNodesQuery)) {
                 synchronized (RemoteClientManager.class) {
@@ -86,6 +92,8 @@ public class RemoteClientManager implements Service {
             instanceList = distinct(instanceList);
             Collections.sort(instanceList);
 
+            gauge.setValue(instanceList.size());
+
             if (logger.isDebugEnabled()) {
                 instanceList.forEach(instance -> logger.debug("Cluster instance: {}", instance.toString()));
             }
@@ -115,11 +123,10 @@ public class RemoteClientManager implements Service {
     }
 
     /**
-     * Because of OAP server register by the UUID which one-to-one mapping with process number.
-     * The register information not delete immediately after process shutdown because of there
-     * is always happened network fault, not really process shutdown. So, cluster module must
-     * wait a few seconds to confirm it. Then there are more than one register information in
-     * the cluster.
+     * Because of OAP server register by the UUID which one-to-one mapping with process number. The register information
+     * not delete immediately after process shutdown because of there is always happened network fault, not really
+     * process shutdown. So, cluster module must wait a few seconds to confirm it. Then there are more than one register
+     * information in the cluster.
      *
      * @param instanceList the instances query from cluster module.
      * @return distinct remote instances
@@ -156,9 +163,8 @@ public class RemoteClientManager implements Service {
     }
 
     /**
-     * Compare clients between exist clients and remote instance collection. Move
-     * the clients into new client collection which are alive to avoid create a
-     * new channel. Shutdown the clients which could not find in cluster config.
+     * Compare clients between exist clients and remote instance collection. Move the clients into new client collection
+     * which are alive to avoid create a new channel. Shutdown the clients which could not find in cluster config.
      *
      * Create a gRPC client for remote instance except for self-instance.
      *
diff --git a/oap-server/server-starter/pom.xml b/oap-server/server-starter/pom.xml
index d02bf15..88f5272 100644
--- a/oap-server/server-starter/pom.xml
+++ b/oap-server/server-starter/pom.xml
@@ -133,6 +133,13 @@
             <artifactId>server-alarm-plugin</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <!-- telemetry -->
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>telemetry-prometheus</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <finalName>skywalking-oap</finalName>
diff --git a/oap-server/server-starter/src/main/resources/application.yml b/oap-server/server-starter/src/main/resources/application.yml
index d352526..5b53d73 100644
--- a/oap-server/server-starter/src/main/resources/application.yml
+++ b/oap-server/server-starter/src/main/resources/application.yml
@@ -96,4 +96,4 @@ query:
 alarm:
   default:
 telemetry:
-  none:
+  prometheus:
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/CounterMetric.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/CounterMetric.java
index 944872a..3cd47fd 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/CounterMetric.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/CounterMetric.java
@@ -25,7 +25,7 @@ package org.apache.skywalking.oap.server.telemetry.api;
  *
  * @author wusheng
  */
-public interface CounterMetric extends TaggableMetric {
+public interface CounterMetric {
     /**
      * Increase 1 to counter
      */
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/GaugeMetric.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/GaugeMetric.java
index 4fd9bfb..8a3cf45 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/GaugeMetric.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/GaugeMetric.java
@@ -23,28 +23,35 @@ package org.apache.skywalking.oap.server.telemetry.api;
  *
  * @author wusheng
  */
-public interface GaugeMetric extends TaggableMetric {
+public interface GaugeMetric {
     /**
-     * Increase 1 to counter
+     * Increase 1 to gauge
      */
     void inc();
 
     /**
-     * Increase the given value to the counter
+     * Increase the given value to the gauge
      *
      * @param value
      */
     void inc(double value);
 
     /**
-     * Decrease 1 to counter
+     * Decrease 1 to gauge
      */
     void dec();
 
     /**
-     * Decrease the given value to the counter
+     * Decrease the given value to the gauge
      *
      * @param value
      */
     void dec(double value);
+
+    /**
+     * Set the given value to the gauge
+     *
+     * @param value
+     */
+    void setValue(double value);
 }
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/HistogramMetric.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/HistogramMetric.java
index 240a318..f5670e4 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/HistogramMetric.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/HistogramMetric.java
@@ -26,7 +26,7 @@ import java.io.*;
  *
  * @author wusheng
  */
-public abstract class HistogramMetric implements TaggableMetric {
+public abstract class HistogramMetric {
     public Timer createTimer() {
         return new Timer(this);
     }
@@ -38,7 +38,7 @@ public abstract class HistogramMetric implements TaggableMetric {
      */
     public abstract void observe(double value);
 
-    class Timer implements Closeable {
+    public class Timer implements Closeable {
         private final HistogramMetric metric;
         private final long startNanos;
         private double duration;
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricCreator.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricCreator.java
index 591d67b..8dcb8cd 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricCreator.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricCreator.java
@@ -32,29 +32,29 @@ public interface MetricCreator extends Service {
      *
      * @param name
      * @param tips
-     * @param labels
+     * @param tagKeys
      * @return
      */
-    CounterMetric createCounter(String name, String tips, MetricTag.Keys labels);
+    CounterMetric createCounter(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues);
 
     /**
      * Create a gauge type metric instance.
      *
      * @param name
      * @param tips
-     * @param labels
+     * @param tagKeys
      * @return
      */
-    GaugeMetric createGauge(String name, String tips, MetricTag.Keys labels);
+    GaugeMetric createGauge(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues);
 
     /**
      * Create a Histogram type metric instance.
      *
      * @param name
      * @param tips
-     * @param labels
+     * @param tagKeys
      * @param buckets Time bucket for duration.
      * @return
      */
-    HistogramMetric createHistogramMetric(String name, String tips, MetricTag.Keys labels, double... buckets);
+    HistogramMetric createHistogramMetric(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues, double... buckets);
 }
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricTag.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricTag.java
index cd5b6b4..1e8beb6 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricTag.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/MetricTag.java
@@ -24,7 +24,10 @@ package org.apache.skywalking.oap.server.telemetry.api;
  * The tag values should be set in putting value phase.
  */
 public class MetricTag {
-    public class Keys {
+    public static final Keys EMPTY_KEY = new Keys();
+    public static final Values EMPTY_VALUE = new Values();
+
+    public static class Keys {
         private String[] keys;
 
         public Keys() {
@@ -40,7 +43,7 @@ public class MetricTag {
         }
     }
 
-    public class Values {
+    public static class Values {
         private String[] values;
 
         public Values(Keys keys) {
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TelemetryRelatedContext.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TelemetryRelatedContext.java
index a37e647..0ed338a 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TelemetryRelatedContext.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TelemetryRelatedContext.java
@@ -23,10 +23,10 @@ package org.apache.skywalking.oap.server.telemetry.api;
  * @author wusheng
  */
 public enum TelemetryRelatedContext {
-    INTANCE;
+    INSTANCE;
 
-    private volatile String id = "default";
-    private TelemetryRelatedContext(){}
+    private volatile String id = null;
+    TelemetryRelatedContext(){}
 
     /**
      * Set a global ID to represent the current oap instance
@@ -36,9 +36,9 @@ public enum TelemetryRelatedContext {
     }
 
     /**
-     * Get the oap instance ID, if be set before, otherwise, return `default` string.
+     * Get the oap instance ID, if be set before.
      *
-     * @return id
+     * @return id or null.
      */
     public String getId() {
         return id;
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java
index c33dda7..10d3ba2 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java
+++ b/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java
@@ -26,16 +26,51 @@ import org.apache.skywalking.oap.server.telemetry.api.*;
  * @author wusheng
  */
 public class MetricCreatorNoop implements MetricCreator {
-    @Override public CounterMetric createCounter(String name, String tips, MetricTag.Keys labels) {
-        return null;
+    @Override
+    public CounterMetric createCounter(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues) {
+        return new CounterMetric() {
+            @Override public void inc() {
+
+            }
+
+            @Override public void inc(double value) {
+
+            }
+        };
     }
 
-    @Override public GaugeMetric createGauge(String name, String tips, MetricTag.Keys labels) {
-        return null;
+    @Override
+    public GaugeMetric createGauge(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues) {
+        return new GaugeMetric() {
+            @Override public void inc() {
+
+            }
+
+            @Override public void inc(double value) {
+
+            }
+
+            @Override public void dec() {
+
+            }
+
+            @Override public void dec(double value) {
+
+            }
+
+            @Override public void setValue(double value) {
+
+            }
+        };
     }
 
     @Override
-    public HistogramMetric createHistogramMetric(String name, String tips, MetricTag.Keys labels, double... buckets) {
-        return null;
+    public HistogramMetric createHistogramMetric(String name, String tips, MetricTag.Keys tagKeys,
+        MetricTag.Values tagValues, double... buckets) {
+        return new HistogramMetric() {
+            @Override public void observe(double value) {
+
+            }
+        };
     }
 }
diff --git a/oap-server/server-telemetry/telemetry-prometheus/pom.xml b/oap-server/server-telemetry/telemetry-prometheus/pom.xml
index 7885f9b..4514c16 100644
--- a/oap-server/server-telemetry/telemetry-prometheus/pom.xml
+++ b/oap-server/server-telemetry/telemetry-prometheus/pom.xml
@@ -31,6 +31,11 @@
     <packaging>jar</packaging>
 
     <dependencies>
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>telemetry-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <!-- The client -->
         <dependency>
             <groupId>io.prometheus</groupId>
diff --git a/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/BaseMetric.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/BaseMetric.java
new file mode 100644
index 0000000..dff3cc7
--- /dev/null
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/BaseMetric.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.telemetry.prometheus;
+
+import java.util.concurrent.locks.ReentrantLock;
+import org.apache.skywalking.oap.server.telemetry.api.*;
+
+/**
+ * BaseMetric parent class represents the me
+ *
+ * @author wusheng
+ */
+public abstract class BaseMetric<T> {
+    private volatile T metricInstance;
+    protected final String name;
+    protected final String tips;
+    protected final MetricTag.Keys labels;
+    protected final MetricTag.Values values;
+    private ReentrantLock lock = new ReentrantLock();
+
+    public BaseMetric(String name, String tips, MetricTag.Keys labels,
+        MetricTag.Values values) {
+        this.name = name;
+        this.tips = tips;
+        this.labels = labels;
+        this.values = values;
+    }
+
+    protected boolean isIDReady() {
+        return TelemetryRelatedContext.INSTANCE.getId() != null;
+    }
+
+    protected T getMetric() {
+        if (metricInstance == null) {
+            if (isIDReady()) {
+                lock.lock();
+                try {
+                    if (metricInstance == null) {
+                        String[] labelNames = new String[labels.getKeys().length + 1];
+                        labelNames[0] = "instance";
+                        for (int i = 0; i < labels.getKeys().length; i++) {
+                            labelNames[i + 1] = labels.getKeys()[i];
+                        }
+
+                        String[] labelValues = new String[values.getValues().length + 1];
+                        labelValues[0] = TelemetryRelatedContext.INSTANCE.getId();
+                        for (int i = 0; i < values.getValues().length; i++) {
+                            labelValues[i + 1] = values.getValues()[i];
+                        }
+
+                        metricInstance = create(labelNames, labelValues);
+                    }
+                } finally {
+                    lock.unlock();
+                }
+            }
+        }
+
+        return metricInstance;
+    }
+
+    protected abstract T create(String[] labelNames, String[] labelValues);
+}
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TaggableMetric.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusConfig.java
similarity index 71%
rename from oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TaggableMetric.java
rename to oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusConfig.java
index ade3ff5..670fb6e 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/api/TaggableMetric.java
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusConfig.java
@@ -16,13 +16,19 @@
  *
  */
 
-package org.apache.skywalking.oap.server.telemetry.api;
+package org.apache.skywalking.oap.server.telemetry.prometheus;
+
+import lombok.*;
+import org.apache.skywalking.oap.server.library.module.ModuleConfig;
 
 /**
- * Set tag values to this metric instance.
+ * The Prometheus telemetry implementor settings.
  *
  * @author wusheng
  */
-public interface TaggableMetric {
-    void setTagValues(MetricTag.Values values);
+@Setter
+@Getter
+public class PrometheusConfig extends ModuleConfig {
+    private String host = "0.0.0.0";
+    private int port = 1234;
 }
diff --git a/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusCounterMetric.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusCounterMetric.java
new file mode 100644
index 0000000..beb0e88
--- /dev/null
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusCounterMetric.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.telemetry.prometheus;
+
+import io.prometheus.client.Counter;
+import org.apache.skywalking.oap.server.telemetry.api.*;
+
+/**
+ * Counter metric in Prometheus implementor.
+ *
+ * @author wusheng
+ */
+public class PrometheusCounterMetric extends BaseMetric<Counter.Child> implements CounterMetric {
+
+    public PrometheusCounterMetric(String name, String tips,
+        MetricTag.Keys labels, MetricTag.Values values) {
+        super(name, tips, labels, values);
+    }
+
+    @Override public void inc() {
+        Counter.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.inc();
+        }
+    }
+
+    @Override public void inc(double value) {
+        Counter.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.inc(value);
+        }
+    }
+
+    @Override protected Counter.Child create(String[] labelNames, String[] labelValues) {
+        return Counter.build()
+            .name(name).help(tips).labelNames(labelNames).register().labels(labelValues);
+    }
+}
diff --git a/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusGaugeMetric.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusGaugeMetric.java
new file mode 100644
index 0000000..ad0f947
--- /dev/null
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusGaugeMetric.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.telemetry.prometheus;
+
+import io.prometheus.client.Gauge;
+import org.apache.skywalking.oap.server.telemetry.api.*;
+
+/**
+ * Gauge metric in Prometheus implementor.
+ *
+ * @author wusheng
+ */
+public class PrometheusGaugeMetric extends BaseMetric<Gauge.Child> implements GaugeMetric {
+    public PrometheusGaugeMetric(String name, String tips,
+        MetricTag.Keys labels,
+        MetricTag.Values values) {
+        super(name, tips, labels, values);
+    }
+
+    @Override public void inc() {
+        Gauge.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.inc();
+        }
+    }
+
+    @Override public void inc(double value) {
+        Gauge.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.inc(value);
+        }
+    }
+
+    @Override public void dec() {
+        Gauge.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.dec();
+        }
+    }
+
+    @Override public void dec(double value) {
+        Gauge.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.dec(value);
+        }
+    }
+
+    @Override public void setValue(double value) {
+        Gauge.Child metric = this.getMetric();
+        if (metric != null) {
+            metric.set(value);
+        }
+    }
+
+    @Override protected Gauge.Child create(String[] labelNames, String[] labelValues) {
+        return Gauge.build()
+            .name(name).help(tips).labelNames(labelNames).register().labels(labelValues);
+    }
+}
diff --git a/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusHistogramMetric.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusHistogramMetric.java
new file mode 100644
index 0000000..f3fdf07
--- /dev/null
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusHistogramMetric.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.telemetry.prometheus;
+
+import io.prometheus.client.Histogram;
+import org.apache.skywalking.oap.server.telemetry.api.*;
+
+/**
+ * HistogramMetric metric in Prometheus implementor.
+ *
+ * @author wusheng
+ */
+public class PrometheusHistogramMetric extends HistogramMetric {
+    private InnerMetricObject inner;
+    private final double[] buckets;
+
+    public PrometheusHistogramMetric(String name, String tips, MetricTag.Keys labels,
+        MetricTag.Values values, double... buckets) {
+        inner = new InnerMetricObject(name, tips, labels, values);
+        this.buckets = buckets;
+    }
+
+    @Override public void observe(double value) {
+
+    }
+
+    class InnerMetricObject extends BaseMetric<Histogram.Child> {
+        public InnerMetricObject(String name, String tips, MetricTag.Keys labels,
+            MetricTag.Values values) {
+            super(name, tips, labels, values);
+        }
+
+        @Override protected Histogram.Child create(String[] labelNames, String[] labelValues) {
+            Histogram.Builder builder = Histogram.build()
+                .name(name).help(tips);
+            if(builder != null){
+                builder = builder.buckets(buckets);
+            }
+            return builder.labelNames(labelNames).register().labels(labelValues);
+        }
+    }
+}
diff --git a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusMetricCreator.java
similarity index 56%
copy from oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java
copy to oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusMetricCreator.java
index c33dda7..966a9ce 100644
--- a/oap-server/server-telemetry/telemetry-api/src/main/java/org/apache/skywalking/oap/server/telemetry/none/MetricCreatorNoop.java
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusMetricCreator.java
@@ -16,26 +16,29 @@
  *
  */
 
-package org.apache.skywalking.oap.server.telemetry.none;
+package org.apache.skywalking.oap.server.telemetry.prometheus;
 
 import org.apache.skywalking.oap.server.telemetry.api.*;
 
 /**
- * A no-op metric create, just create nut shell metric instance.
+ * Create metric instance for Prometheus exporter.
  *
  * @author wusheng
  */
-public class MetricCreatorNoop implements MetricCreator {
-    @Override public CounterMetric createCounter(String name, String tips, MetricTag.Keys labels) {
-        return null;
+public class PrometheusMetricCreator implements MetricCreator {
+    @Override
+    public CounterMetric createCounter(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues) {
+        return new PrometheusCounterMetric(name, tips, tagKeys, tagValues);
     }
 
-    @Override public GaugeMetric createGauge(String name, String tips, MetricTag.Keys labels) {
-        return null;
+    @Override
+    public GaugeMetric createGauge(String name, String tips, MetricTag.Keys tagKeys, MetricTag.Values tagValues) {
+        return new PrometheusGaugeMetric(name, tips, tagKeys, tagValues);
     }
 
     @Override
-    public HistogramMetric createHistogramMetric(String name, String tips, MetricTag.Keys labels, double... buckets) {
-        return null;
+    public HistogramMetric createHistogramMetric(String name, String tips, MetricTag.Keys tagKeys,
+        MetricTag.Values tagValues, double... buckets) {
+        return new PrometheusHistogramMetric(name, tips, tagKeys, tagValues, buckets);
     }
 }
diff --git a/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusTelemetryProvider.java b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusTelemetryProvider.java
new file mode 100644
index 0000000..26890d9
--- /dev/null
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/java/org/apache/skywalking/oap/server/telemetry/prometheus/PrometheusTelemetryProvider.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.telemetry.prometheus;
+
+import io.prometheus.client.exporter.HTTPServer;
+import java.io.IOException;
+import org.apache.skywalking.oap.server.library.module.*;
+import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import org.apache.skywalking.oap.server.telemetry.api.MetricCreator;
+
+/**
+ * Start the Prometheus
+ *
+ * @author wusheng
+ */
+public class PrometheusTelemetryProvider extends ModuleProvider {
+    private PrometheusConfig config;
+
+    public PrometheusTelemetryProvider() {
+        config = new PrometheusConfig();
+    }
+
+    @Override public String name() {
+        return "prometheus";
+    }
+
+    @Override public Class<? extends ModuleDefine> module() {
+        return TelemetryModule.class;
+    }
+
+    @Override public ModuleConfig createConfigBeanIfAbsent() {
+        return config;
+    }
+
+    @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException {
+        this.registerServiceImplementation(MetricCreator.class, new PrometheusMetricCreator());
+        try {
+            HTTPServer server = new HTTPServer(config.getHost(), config.getPort());
+        } catch (IOException e) {
+            throw new ModuleStartException(e.getMessage(), e);
+        }
+    }
+
+    @Override public void start() throws ServiceNotProvidedException, ModuleStartException {
+
+    }
+
+    @Override public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException {
+    }
+
+    @Override public String[] requiredModules() {
+        return new String[0];
+    }
+}
diff --git a/oap-server/server-telemetry/telemetry-prometheus/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleProvider b/oap-server/server-telemetry/telemetry-prometheus/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleProvider
new file mode 100644
index 0000000..1e72991
--- /dev/null
+++ b/oap-server/server-telemetry/telemetry-prometheus/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleProvider
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+
+org.apache.skywalking.oap.server.telemetry.prometheus.PrometheusTelemetryProvider