日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用Prometheus Client監控應用

通過在應用中埋點來暴露應用數據,使用Prometheus Client監控抓取數據,即可實現利用Prometheus監控應用的目的。本文以阿里云容器服務Kubernetes集群和阿里云容器鏡像服務為例,介紹如何通過Prometheus Client監控應用。

前提條件

步驟一:對應用埋點

Prometheus Client目前支持大部分編程語言,更多信息,請參見CLIENT LIBRARIES。以下示例通過對應用埋點以暴露Go應用的監控數據:

package main
import (
    "flag"
    "fmt"
    "log"
    "math"
    "math/rand"
    "net/http"
    "time"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    addr              = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.")
    uniformDomain     = flag.Float64("uniform.domain", 0.0002, "The domain for the uniform distribution.")
    normDomain        = flag.Float64("normal.domain", 0.0002, "The domain for the normal distribution.")
    normMean          = flag.Float64("normal.mean", 0.00001, "The mean for the normal distribution.")
    oscillationPeriod = flag.Duration("oscillation-period", 10*time.Minute, "The duration of the rate oscillation period.")
)

var (
    // Create a summary to track fictional interservice RPC latencies for three distinct services with different latency distributions. 
    // These services are differentiated via a "service" label.
    rpcDurations = prometheus.NewSummaryVec(
        prometheus.SummaryOpts{
            Name:       "rpc_durations_seconds",
            Help:       "RPC latency distributions.",
            Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
        },
        []string{"service"},
    )
    // The same as above, but now as a histogram, and only for the normal
    // distribution. The buckets are targeted to the parameters of the
    // normal distribution, with 20 buckets centered on the mean, each
    // half-sigma wide.
    rpcDurationsHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{
        Name:    "rpc_durations_histogram_seconds",
        Help:    "RPC latency distributions.",
        Buckets: prometheus.LinearBuckets(*normMean-5**normDomain, .5**normDomain, 20),
    })
)

func init() {
    // Register the summary and the histogram with Prometheus's default registry.
    prometheus.MustRegister(rpcDurations)
    prometheus.MustRegister(rpcDurationsHistogram)
    // Add Go module build info.
    prometheus.MustRegister(prometheus.NewBuildInfoCollector())
}

func main() {
    flag.Parse()
    start := time.Now()
    oscillationFactor := func() float64 {
        return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(*oscillationPeriod)))
    }
    // Periodically record some sample latencies for the three services.
    go func() {
        for {
            v := rand.Float64() * *uniformDomain
            rpcDurations.WithLabelValues("uniform").Observe(v)
            time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond)
        }
    }()
    go func() {
        for {
            v := (rand.NormFloat64() * *normDomain) + *normMean
            rpcDurations.WithLabelValues("normal").Observe(v)
            // Demonstrate exemplar support with a dummy ID. This
            // would be something like a trace ID in a real
            // application.  Note the necessary type assertion. We
            // already know that rpcDurationsHistogram implements
            // the ExemplarObserver interface and thus don't need to
            // check the outcome of the type assertion.
            rpcDurationsHistogram.(prometheus.ExemplarObserver).ObserveWithExemplar(
                v, prometheus.Labels{"dummyID": fmt.Sprint(rand.Intn(100000))},
            )
            time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond)
        }
    }()
    go func() {
        for {
            v := rand.ExpFloat64() / 1e6
            rpcDurations.WithLabelValues("exponential").Observe(v)
            time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond)
        }
    }()
    // Expose the registered metrics via HTTP.
    http.Handle("/metrics", promhttp.HandlerFor(
        prometheus.DefaultGatherer,
        promhttp.HandlerOpts{
            // Opt into OpenMetrics to support exemplars.
            EnableOpenMetrics: true,
        },
    ))
    log.Fatal(http.ListenAndServe(*addr, nil))
}

在本示例中,相關參數說明如下:

  • 在注冊rpc_durations_seconds指標前需要注冊一個監控指標prometheus.MustRegister。本示例中rpc_durations_secondsprometheus.NewSummaryVec類型,更多其他類型,請參見Prometheus

  • rpcDurations是一個全局的單例,在更新監控數據時通過調用rpcDurations.WithLabelValues("uniform").Observe(v)增加監控數據。

關于代碼模板,請參見prometheus / client_golang

步驟二:將應用制作為鏡像并上傳到鏡像倉庫

將完成埋點的應用制作成鏡像并上傳至阿里云容器鏡像服務的鏡像倉庫。

  1. 執行以下命令構建鏡像。

    docker build -t <本地臨時Docker鏡像名稱>:<本地臨時Docker鏡像版本號> . --no-cache

    示例命令:

    docker build -t prometheus-demo:v1 . --no-cache
  2. 執行以下命令為鏡像打標。

    sudo docker tag <本地臨時Docker鏡像名稱>:<本地臨時Docker鏡像版本號> <Registry域名>/<命名空間>/<鏡像名稱>:<鏡像版本號>

    示例命令:

    sudo docker tag prometheus-demo:v1 registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1
  3. 執行以下命令將鏡像推送至鏡像倉庫。

    sudo docker push <Registry域名>/<命名空間>/<鏡像名稱>:<鏡像版本號>

    示例命令:

    sudo docker push registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1
  4. 查看已推送的鏡像。

    1. 登錄容器鏡像服務控制臺

    2. 在頂部菜單欄,選擇所需地域。

    3. 在左側導航欄,選擇實例列表

    4. 實例列表頁面單擊個人版實例。

    5. 在個人版實例管理頁面選擇倉庫管理 > 鏡像倉庫

    6. 鏡像倉庫頁面單擊目標倉庫操作列的管理

    7. 在左側導航欄,選擇鏡像版本

      在鏡像版本列表中可查看已推送的鏡像。

步驟三:將應用部署至容器服務Kubernetes集群

  1. 登錄容器服務管理控制臺,在左側導航欄選擇集群

  2. 集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇工作負載 > 容器組

  3. 創建容器組。

    1. 容器組頁面,單擊使用YAML創建資源

    2. 創建頁面的模板代碼框輸入以下內容,然后單擊創建

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: demo-app
        labels:
          app: demo-app
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: demo-app
        template:
          metadata:
            labels:
              app: demo-app
          spec:
            containers:
            - name: demo-app
              image: <Registry域名>/<命名空間>/<鏡像名稱>:<鏡像版本號>
              command:
              - /random 
              ports:
              - containerPort: 8080

      示例代碼:

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: demo-app
        labels:
          app: demo-app
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: demo-app
        template:
          metadata:
            labels:
              app: demo-app
          spec:
            containers:
            - name: demo-app
              image: registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1
              command:
              - /random 
              ports:
              - containerPort: 8080

    容器組頁面可查看已創建的容器組。

  4. 創建服務。

    1. 在集群管理頁左側導航欄,選擇網絡 > 服務

    2. 服務頁面,單擊使用YAML創建資源

    3. 創建頁面的模板代碼框輸入以下內容,然后單擊創建

      apiVersion: v1
      kind: Service
      metadata:
        labels:
          app: demo-app
        name: demo-app
        namespace: default
      spec:
        ports:
        - name: http-metrics
          port: 8080
          protocol: TCP
          targetPort: 8080
        selector:
          app: demo-app
        type: ClusterIP 

    服務頁面可查看已創建的服務。

步驟四:配置服務發現

配置阿里云Prometheus監控的服務發現以抓取Go應用數據。本示例以ARMS控制臺操作為例:

  1. 登錄ARMS控制臺

  2. 在頂部菜單欄,選擇集群所在的地域。

  3. 在左側導航欄,單擊接入管理,在已接入環境的環境列表頁面,單擊目標環境名稱(和集群名稱一致)。

  4. 容器環境頁面,單擊指標采集頁簽,然后在左側導航欄單擊ServiceMonitor

  5. 在ServiceMonitor列表單擊新增,在新增ServiceMonitor配置對話框中輸入以下內容,然后單擊創建

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        app: demo-app
      name: demo-app
      namespace: default
      annotations:
        arms.prometheus.io/discovery: 'true'
    spec:
      endpoints:
      - interval: 30s
        port: http-metrics
      jobLabel: app
      namespaceSelector:
        matchNames:
        - default
      selector:
        matchLabels:
          app: demo-app

    ServiceMonitor頁簽下可查看已配置的服務發現。

步驟五:驗證Prometheus Client是否支持通過指標監控應用數據

  1. 登錄ARMS控制臺

  2. 在頂部菜單欄,選擇集群所在的地域。

  3. 在左側導航欄,選擇指標中心>指標總覽,然后在搜索框輸入步驟一:對應用埋點注冊的指標rpc_durations_seconds,單擊查詢圖標。

    若查詢到指標rpc_durations_seconds,表示Prometheus Client已通過該指標監控應用數據。